我在尝试获取单元格的值时遇到了一个数据网格问题。在到达第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;
}
}
谢谢你
2条答案
按热度按时间cbjzeqam1#
是否限制迭代中的数据网格行?
它被称为UI虚拟化,意味着数据项的可视容器是按需创建的。
直接访问可视元素被认为是一种不好的做法,但如果出于某种原因确实需要这样做,您可能应该关闭虚拟化:
另一个选择是将
RadioButton
的IsChecked
属性绑定到数据对象的属性,并查看此属性而不是RadioButton
的属性。moiiocjp2#
你的迭代从0开始到你的列表计数。看起来列表有19个元素,你的循环继续到第20个元素,它是空的。
它应该是这样的: