Iterate/Loop through Datagrid rows to get the value of checkbox column using Silverlight/ c# wpf: NullReferenceException error

南笙酒味 提交于 2019-12-13 06:17:44

问题


I have a DataGrid in Silverlight xaml which contains three columns named Active(checkbox), name(Textcolumn), ID (Textcolumn) and a Save button outside the datagrid. I am getting the following error when I try to loop/iterate through the datagrid rows to get the value of the checkbox using GetCellContent. GetCellContent works fine for first 20 rows but gives the NullReferenceException error after that. Please help.

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>

Save button Click event

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

}
}    
}

回答1:


I had the same issue and determined that non-text cells (checkboxes, buttons, etc.) will only return their value if they are rendered, otherwise they return null. Further, only the rows of the DataGrid that are displayed on the control are actually rendered. So in your case, I would bet that your DataGrid is sized such that it displays 20 rows at a time, so the 21st row returns null.

What I wound up doing is iterating through the ItemSource instead of the DataGrid itself. Ultimately this is a better implementation anyway so as to not violate MVVM by mixing data access with UI.

However, if you really want/need to do it using the DataGrid directly, you can force the cell to render in code:

            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();
                }
             }


来源:https://stackoverflow.com/questions/16181258/iterate-loop-through-datagrid-rows-to-get-the-value-of-checkbox-column-using-sil

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!