You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF C#获取DataGrid选中值报错:超10行时出现空引用异常

解决WPF DataGrid选中多行时的空引用异常问题

这个问题我之前也碰到过!核心原因是WPF DataGrid默认开启了UI虚拟化——当行不在当前可视区域内时,系统不会创建对应的单元格UI元素,这时候调用GetCellContent(item)就会返回null,你再把它强转成TextBlock自然就抛出空引用异常了。10行以内正常是因为这些行都在可视范围内,UI元素都被创建出来了,超过10行后部分行滚出了视图,就触发这个问题了。

给你两个解决方案,优先推荐第一个,更符合WPF的设计思路:

方案一:直接从数据源对象获取属性(推荐)

WPF的DataGrid是用来展示数据的,最可靠的方式是直接从绑定的数据源对象里拿值,而不是去操作UI元素。假设你的DataGrid绑定的是ObservableCollection<YourDataModel>,其中YourDataModel有对应第二列的Name属性,代码可以改成这样:

// 先把SelectedItems转成你的数据模型类型
foreach (var selectedItem in MyGrid.SelectedItems.Cast<YourDataModel>())
{
    if (selectedItem == null)
        continue;
    // 直接取模型的属性,不用碰UI元素
    string name = selectedItem.Name;
    MessageBox.Show(name);
}

如果不确定选中项的类型,也可以用as做安全转换:

foreach (var item in MyGrid.SelectedItems)
{
    var dataItem = item as YourDataModel;
    if (dataItem == null)
        continue;
    string name = dataItem.Name;
    MessageBox.Show(name);
}

记得把YourDataModel替换成你实际使用的数据模型类名哦。

方案二:关闭UI虚拟化(不推荐,仅小数据量场景用)

如果实在不想改数据源的方式,可以关闭DataGrid的UI虚拟化,让所有行都创建UI元素。你可以在XAML里设置:

<DataGrid x:Name="MyGrid" VirtualizingStackPanel.IsVirtualizing="False" />

或者在代码里设置:

MyGrid.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, false);

但要注意,这种方式在数据量大的时候会明显降低性能,因为要一次性创建所有行的UI元素,所以只适合数据量很小的场景。

内容的提问来源于stack exchange,提问作者Reza.S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:25:20