我在Silverlight xaml中有一个DataGrid,其中包含三个名为Active(复选框),名称(Textcolumn),ID(Textcolumn)的列以及datagrid外部的Save按钮。当我尝试循环/遍历datagrid行以使用GetCellContent获取复选框的值时,我收到以下错误。 GetCellContent适用于前20行,但在此之后会出现NullReferenceException错误。请帮忙。
System.NullReferenceException: Object reference not set to an instance of an object.
XAML
<StackPanel Orientation="Horizontal">
<Button Content ="Save" Click="SavePopUp_Click"/>
<TextBlock x:Name="GridHeader" Style="{StaticResource GridHeaderStyle}" Margin="0,0,0,0" Width="445" Foreground="White" HorizontalAlignment="Right" TextAlignment="Center" Visibility="Collapsed"/>
</StackPanel>
<sdk:DataGrid x:Name="dgloss">
<sdk:DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border>
<Border Margin="2" Padding="2" BorderBrush="#AAAAAA" BorderThickness="2" CornerRadius="4">
</Border>
</Border>
</DataTemplate>
</sdk:DataGrid.RowDetailsTemplate>
<sdk:DataGrid.Columns>
<!--<sdk:DataGridCheckBoxColumn IsReadOnly="False" Header="Active" Binding="{Binding Active, Mode=TwoWay}" CanUserResize="False" />-->
<sdk:DataGridTemplateColumn Header ="Active">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="chkcode" Tag="{Binding Active}" Checked="HandleCheck" Unchecked="HandleUnchecked" IsThreeState="False" HorizontalAlignment ="Center" VerticalAlignment="Center" IsChecked="{Binding Active, Mode=TwoWay}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTextColumn IsReadOnly="True" SortMemberPath="Name" Header="Name" Binding="{Binding Name, Mode=TwoWay}" Foreground="White"/>
<sdk:DataGridTextColumn x:Name="ID" IsReadOnly="True" SortMemberPath="ID" Header="ID" Binding="{Binding ID, Mode=TwoWay}" Foreground="White" Visibility="Visible"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
保存按钮点击事件
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);
}
}
}
答案 0 :(得分:0)
我遇到了同样的问题并确定非文本单元格(复选框,按钮等)只有在渲染时才会返回它们的值,否则它们将返回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();
}
}