0

我在 Silverlight xaml 中有一个 DataGrid,其中包含三个名为 Active(checkbox)、name(Textcolumn)、ID (Textcolumn) 的列和数据网格外部的 Save 按钮。当我尝试循环/迭代数据网格行以使用 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);

}
}    
}
4

1 回答 1

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();
                }
             }
于 2014-09-27T20:22:21.120 回答