当数据网格行在网格中不可见时,如何避免空引用异常?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当数据网格行在网格中不可见时,如何避免空引用异常?相关的知识,希望对你有一定的参考价值。

<DataGrid x:Name="gridView" HorizontalAlignment="Left" Height="263" Margin="10,10,0,0" VerticalAlignment="Top" Width="235" AutoGeneratingColumn="gridView_AutoGeneratingColumn" GotFocus="gridView_GotFocus">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}"/>
        </DataGrid.Columns>
    </DataGrid>

//Get count and data of checked parts from gridview
            foreach (var row in gridView.ItemsSource)
            {
                bool IsChecked = (bool)((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked;

                if (IsChecked)
                {
                    var part = ((TextBlock)gridView.Columns[1].GetCellContent(row)).Text;
                    var code = ((TextBlock)gridView.Columns[2].GetCellContent(row)).Text;
                    var um = ((TextBlock)gridView.Columns[3].GetCellContent(row)).Text;
                    addToPartList(part, code, um);
                    checkCount += 1;
                }
            }

此代码的目的是从用户检查的所有行中收集行数据。 Datagrid的数据源是一个列表,其中复选框列添加到网格中。问题是如果网格足够大以至于需要网格滚动条,则可见网格外部的行在转换为bool类型时会返回空引用异常。我怎样才能解决这个问题?

答案
                if (((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked != null)
                {

                    bool IsChecked = (bool)((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked;

                    if (IsChecked)
                    {
                        var part = ((TextBlock)gridView.Columns[1].GetCellContent(row)).Text;
                        var code = ((TextBlock)gridView.Columns[2].GetCellContent(row)).Text;
                        var um = ((TextBlock)gridView.Columns[3].GetCellContent(row)).Text;
                        addToPartList(part, code, um);
                        checkCount += 1;
                    }
                }

正如@Sievajet建议的那样,我在转换之前添加了空值检查并解决了问题。这不再抛出空引用异常。

另一答案

不是答案,只是一点点改进。你可以避免两个;

if ((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked??false)
{
    var part = ((TextBlock)gridView.Columns[1].GetCellContent(row)).Text;
    var code = ((TextBlock)gridView.Columns[2].GetCellContent(row)).Text;
    var um = ((TextBlock)gridView.Columns[3].GetCellContent(row)).Text;
    addToPartList(part, code, um);
    checkCount += 1;
}

除非你想在其他地方使用IsChecked变量。

以上是关于当数据网格行在网格中不可见时,如何避免空引用异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止数据网格中的行在应用程序运行时闪烁

如何使选定的行在未聚焦的数据网格中突出显示?

SpriteKit:如何添加/删除节点并避免枚举时出现突变异常?

如何根据VS2012上另一个数据网格的选定行在数据网格上显示sql队列结果

交错网格视图在 Flutter 中不向上滚动

如何避免滚动条空间而不出现在 extjs 网格面板中?