wpf 迭代数据网格行以获取单选列的值,在20行之后出现Null异常

ivqmmu1c  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(147)

我在尝试获取单元格的值时遇到了一个数据网格问题。在到达第20行之前,一切都很正常。我遇到了一个空异常。这是迭代中数据网格行的限制吗?因为在可视化中,我可以看到所有的行。
我没有问题,在过去与数据网格,但他们不是任何单选按钮或复选框列,也许是一个问题,他们的渲染?
下面是我的代码:
XAML语言

<DataGrid x:Name="datagrid_wafer_300" Margin="5" HeadersVisibility="Column" GridLinesVisibility="None">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding ID}" Header="ID" Width="140" IsReadOnly="True" Visibility="Hidden">
                                <DataGridTextColumn.HeaderStyle>
                                    <Style TargetType="{x:Type DataGridColumnHeader}">
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                        <Setter Property="FontWeight" Value="Bold" />
                                    </Style>
                                </DataGridTextColumn.HeaderStyle>
                                <DataGridTextColumn.ElementStyle>
                                    <Style>
                                        <Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
                                        <Setter Property="TextBlock.TextAlignment" Value="Center"/>
                                        <Setter Property="TextBlock.Margin" Value="10,0"/>
                                        <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
                                    </Style>
                                </DataGridTextColumn.ElementStyle>
                            </DataGridTextColumn>
                            <DataGridTemplateColumn x:Name="column_check_300" Width="10" IsReadOnly="True">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <RadioButton HorizontalAlignment="Center" VerticalAlignment="Center" GroupName="{Binding Part_Number}"  IsChecked="{Binding IsIncluded}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn Binding="{Binding Part_Number}" Header="Part Number" Width="140" IsReadOnly="True">
                                <DataGridTextColumn.HeaderStyle>
                                    <Style TargetType="{x:Type DataGridColumnHeader}">
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                        <Setter Property="FontWeight" Value="Bold" />
                                    </Style>
                                </DataGridTextColumn.HeaderStyle>
                                <DataGridTextColumn.ElementStyle>
                                    <Style>
                                        <Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
                                        <Setter Property="TextBlock.TextAlignment" Value="Center"/>
                                        <Setter Property="TextBlock.Margin" Value="10,0"/>
                                        <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
                                    </Style>
                                </DataGridTextColumn.ElementStyle>
                            </DataGridTextColumn>
                            <DataGridTextColumn Binding="{Binding Description}" Header="Description" Width="*" IsReadOnly="True">
                                <DataGridTextColumn.HeaderStyle>
                                    <Style TargetType="{x:Type DataGridColumnHeader}">
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                        <Setter Property="FontWeight" Value="Bold" />
                                    </Style>
                                </DataGridTextColumn.HeaderStyle>
                                <DataGridTextColumn.ElementStyle>
                                    <Style>
                                        <Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
                                        <Setter Property="TextBlock.TextAlignment" Value="Center"/>
                                        <Setter Property="TextBlock.Margin" Value="10,0"/>
                                        <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
                                    </Style>
                                </DataGridTextColumn.ElementStyle>
                            </DataGridTextColumn>
                            <DataGridTemplateColumn x:Name="column_exclude_300" Header="Exclude?" Width="60" IsReadOnly="True">
                                <DataGridTemplateColumn.HeaderStyle>
                                    <Style TargetType="{x:Type DataGridColumnHeader}">
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                        <Setter Property="VerticalAlignment" Value="Center"/>
                                        <Setter Property="FontWeight" Value="Bold" />
                                    </Style>
                                </DataGridTemplateColumn.HeaderStyle>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <RadioButton HorizontalAlignment="Center" VerticalAlignment="Center" GroupName="{Binding Part_Number}" IsChecked="{Binding IsIncluded}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>

C#程式码:

private void Clear_Datagrid()
{
        for (int i = 0; i < datagrid_wafer_200.Items.Count; i++)
        {
            var item = datagrid_wafer_200.Items[i];
            FrameworkElement elmtTest = datagrid_wafer_200.Columns[1].GetCellContent(item);
            var radio = FindVisualChild<RadioButton>(elmtTest);
            var wafer = datagrid_wafer_200.Columns[2].GetCellContent(item) as TextBlock;
            FrameworkElement elmtTest1 = datagrid_wafer_200.Columns[4].GetCellContent(item);
            var exclude = FindVisualChild<RadioButton>(elmtTest1);

            radio.IsChecked = false;
            exclude.IsChecked = false;
        }

        for (int i = 0; i < datagrid_wafer_300.Items.Count; i++)
        {
            var item = datagrid_wafer_300.Items[i];
            FrameworkElement elmtTest = datagrid_wafer_300.Columns[1].GetCellContent(item);

            var radio = FindVisualChild<RadioButton>(elmtTest);
            var wafer = datagrid_wafer_300.Columns[2].GetCellContent(item) as TextBlock;
            FrameworkElement elmtTest1 = datagrid_wafer_300.Columns[4].GetCellContent(item);
            var exclude = FindVisualChild<RadioButton>(elmtTest1);

            radio.IsChecked = false;
            exclude.IsChecked = false;
        }
}

谢谢你

cbjzeqam

cbjzeqam1#

是否限制迭代中的数据网格行?
它被称为UI虚拟化,意味着数据项的可视容器是按需创建的。
直接访问可视元素被认为是一种不好的做法,但如果出于某种原因确实需要这样做,您可能应该关闭虚拟化:

<DataGrid VirtualizingPanel.IsVirtualizing="False" EnableRowVirtualization="False" ... />

另一个选择是将RadioButtonIsChecked属性绑定到数据对象的属性,并查看此属性而不是RadioButton的属性。

moiiocjp

moiiocjp2#

你的迭代从0开始到你的列表计数。看起来列表有19个元素,你的循环继续到第20个元素,它是空的。
它应该是这样的:

for (int i = 0; i < datagrid_wafer_200.Items.Count - 1; i++)
{
    // ...
}  
for (int i = 0; i < datagrid_wafer_300.Items.Count - 1; i++)
{
    // ...
}

相关问题