首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当数据网格行在网格中不可见时,如何避免空引用异常?

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

Stack Overflow用户
提问于 2017-12-18 07:35:26
回答 2查看 657关注 0票数 0
代码语言:javascript
运行
复制
<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类型时返回null引用异常。我怎样才能解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-18 08:13:58

代码语言:javascript
运行
复制
                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建议的那样,我在转换之前添加了对空值的检查,并解决了这个问题。这不再抛出空引用异常。

票数 0
EN

Stack Overflow用户

发布于 2017-12-18 21:13:10

不是一个答案,只是一点点的改进。你可以通过这个来避免两个if;

代码语言:javascript
运行
复制
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变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47860502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档