【问题标题】:How to avoid Null reference exception when datagrid rows are not visible within grid?当数据网格行在网格中不可见时如何避免空引用异常?
【发布时间】:2017-12-17 23:35:26
【问题描述】:
<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 类型时会返回空引用异常。我该如何解决这个问题?

【问题讨论】:

  • 为什么不使用空检查?

标签: c# wpf datagrid


【解决方案1】:
                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 建议的那样,我在转换之前添加了一个空值检查并解决了这个问题。这不再引发空引用异常。

【讨论】:

    【解决方案2】:

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

    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 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2018-11-14
      • 2011-04-27
      • 2017-01-21
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多