【问题标题】:Iterate/Loop through Datagrid rows to get the value of checkbox column using Silverlight/ c# wpf: NullReferenceException error使用 Silverlight/ c# wpf: NullReferenceException 错误遍历 Datagrid 行以获取复选框列的值
【发布时间】:2013-04-17 08:53:44
【问题描述】:

我在 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);

}
}    
}

【问题讨论】:

    标签: c# silverlight checkbox datagridview nullreferenceexception


    【解决方案1】:

    我遇到了同样的问题,并确定非文本单元格(复选框、按钮等)只有在呈现时才会返回它们的值,否则它们会返回 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();
                    }
                 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2016-01-13
      • 2019-09-13
      • 2018-06-24
      • 2013-12-12
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多