使用Silverlight/c#wpf:NullReferenceException error迭代/循环Datagrid行以获取复选框列的值

使用Silverlight/c#wpf:NullReferenceException error迭代/循环Datagrid行以获取复选框列的值,c#,silverlight,checkbox,datagridview,nullreferenceexception,C#,Silverlight,Checkbox,Datagridview,Nullreferenceexception,我在Silverlight xaml中有一个DataGrid,它包含三列,分别命名为Active(复选框)、name(Textcolumn)、ID(Textcolumn)和DataGrid外部的Save按钮。当我尝试使用GetCellContent循环/迭代datagrid行以获取复选框的值时,出现以下错误。GetCellContent在前20行可以正常工作,但之后会出现NullReferenceException错误。请帮忙 System.NullReferenceException: Obj

我在Silverlight xaml中有一个DataGrid,它包含三列,分别命名为Active(复选框)、name(Textcolumn)、ID(Textcolumn)和DataGrid外部的Save按钮。当我尝试使用GetCellContent循环/迭代datagrid行以获取复选框的值时,出现以下错误。GetCellContent在前20行可以正常工作,但之后会出现NullReferenceException错误。请帮忙

System.NullReferenceException: Object reference not set to an instance of an object.
XAML


保存按钮单击事件

    private void SavePopUp_Click(object sender, RoutedEventArgs e)
            {
               IEnumerable list = dgloss.ItemsSource as IEnumerable;
               List<string> lstFile = new List<string>();

               foreach (var row in list)
               {  
                   bool IsChecked = (bool)((CheckBox)dgloss.Columns[0].GetCellContent(row)).IsChecked;

                   if (IsChecked)
                   {
                      string id = ((TextBlock)grdLossCodelist.Columns[2].GetCellContent(row)).Text;
                       lstFile.Add(id);

}
}    
}
private void SavePopUp\u单击(对象发送者,路由目标)
{
IEnumerable list=dgloss.ItemsSource为IEnumerable;
List lstFile=新列表();
foreach(列表中的变量行)
{  
bool IsChecked=(bool)((复选框)dgloss.Columns[0].GetCellContent(行)).IsChecked;
如果(已检查)
{
字符串id=((TextBlock)grdLossCodelist.Columns[2].GetCellContent(row)).Text;
lstFile.Add(id);
}
}    
}

我也有同样的问题,并确定非文本单元格(复选框、按钮等)仅在呈现时返回其值,否则返回null。此外,实际上仅呈现控件上显示的DataGrid行。所以在您的例子中,我敢打赌您的DataGrid的大小是这样的,它一次显示20行,所以第21行返回null

最后我做的是迭代ItemSource而不是DataGrid本身。总之,这是一个更好的实现,这样就不会因为将数据访问与UI混合而违反MVVM

但是,如果您确实希望/需要直接使用DataGrid进行渲染,则可以强制单元格以代码进行渲染:

            foreach (var column in dataGrid.Columns)
            {
                DataGridTemplateColumn dgtColumn = null;
                DataGridBoundColumn dgbColumn = null;

                dgbColumn = column as DataGridBoundColumn;

                if (dgbColumn == null)
                {
                    dgtColumn = column as DataGridTemplateColumn;
                    CheckBox checkbox = (CheckBox)dgtColumn.CellTemplate.LoadContent();
                }
             }
            foreach (var column in dataGrid.Columns)
            {
                DataGridTemplateColumn dgtColumn = null;
                DataGridBoundColumn dgbColumn = null;

                dgbColumn = column as DataGridBoundColumn;

                if (dgbColumn == null)
                {
                    dgtColumn = column as DataGridTemplateColumn;
                    CheckBox checkbox = (CheckBox)dgtColumn.CellTemplate.LoadContent();
                }
             }