wpf DataGrid 获取第一列checkBox 值,当数据源数量大于某一值,则为null

fengyoujie 2012-11-08 10:07:03
各位老师好!

在wpf中,在datagrid控件,第一列添加一个checkbox。我在遍历checbox的选择值的时候,发现当datagrid的行超过28行,就崩溃。下面把代码发出来。


xaml文件DataGrid的配置如下:


<DataGrid Margin="0,0,0,0" Grid.Row="0" Grid.Column="0" Height="450" VerticalAlignment="Top" Name="dataGrid" IsReadOnly="True" CanUserAddRows="false" AutoGenerateColumns="True">
<DataGrid.Columns>

<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Name="selectAll_checkBox" Content="全选" IsEnabled="False" HorizontalAlignment="Center" Click="selectAll_Checked"/>
</DataGridTemplateColumn.Header>

<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="select_checkBox" Click="CheckBox_Checked" Tag="{Binding Path= id}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>


全部的xaml:

<Page x:Class="metadataTool.DelMetaDataPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="650" d:DesignWidth="1100"
Title="DelMetaDataPage">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" >
<ScrollViewer.Content>
<StackPanel Height="{Binding Path=ActualHeight,ElementName=exportMetaData_page}" Width="{Binding Path=ActualWidth, ElementName=exportMetaData_page}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="70"></ColumnDefinition>
<ColumnDefinition Width="110"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" VerticalAlignment="Top" Margin="5 5 0 0">删除类别</Label>
<ComboBox Name="delTypeCombox" Grid.Column="1" SelectedIndex="0" Height="24" VerticalAlignment="Top" Margin="0 5 10 0">
<ComboBoxItem Name="exported" >已导出</ComboBoxItem>
<ComboBoxItem Name="unExport">未导出</ComboBoxItem>
</ComboBox>
<StackPanel Name="searchCondition_stackPanel" Grid.Column="2" VerticalAlignment="Top">

</StackPanel>
</Grid>
<Grid Height="500" Margin="1,5,2,5" Width="1200">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="auto" ></RowDefinition>
<RowDefinition Height="7*" />
</Grid.RowDefinitions>

<DataGrid Margin="0,0,0,0" Grid.Row="0" Grid.Column="0" Height="450" VerticalAlignment="Top" Name="dataGrid" IsReadOnly="True" CanUserAddRows="false" AutoGenerateColumns="True">
<DataGrid.Columns>

<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Name="selectAll_checkBox" Content="全选" IsEnabled="False" HorizontalAlignment="Center" Click="selectAll_Checked"/>
</DataGridTemplateColumn.Header>

<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="select_checkBox" Click="CheckBox_Checked" Tag="{Binding Path= id}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>


<Button Content="移除" Height="23" Grid.Row="1" Name="button_remove" IsEnabled="False" Width="108" Click="button_remove_Click" Margin="322,6,767,14" />
<Button Content="删除" Grid.Row="1" Height="23" Name="button_delete" IsEnabled="False" Width="108" Click="button_delete_Click" HorizontalAlignment="Left" Margin="646,6,0,0" VerticalAlignment="Top" />

</Grid>

</StackPanel>
</ScrollViewer.Content>
</ScrollViewer>
</Page>




遍历datagrid 代码如下:

for (int index = 0; index < dataGrid.Items.Count;index++ )//foreach (var item in this.dataGrid.Items)
{
FrameworkElement item = dataGrid.Columns[0].GetCellContent(dataGrid.Items[index]);
DataGridTemplateColumn temp = (dataGrid.Columns[0] as DataGridTemplateColumn);
CheckBox cb = temp.CellTemplate.FindName("select_checkBox", item) as CheckBox;

if (!(cb.IsChecked == true))
{
//逻辑代码
}
}


当dataGrid.Items.Count小于28的时候,程序运行良好。当时dataGrid.Itmes.Count大于28的时候,
运行到

FrameworkElement item = dataGrid.Columns[0].GetCellContent(view);

item 为null。

请问诸位老师,这是什么原因呢?多谢了。
...全文
326 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyoujie 2012-11-08
  • 打赏
  • 举报
回复
引用 楼主 fengyoujie 的回复:
各位老师好!

在wpf中,在datagrid控件,第一列添加一个checkbox。我在遍历checbox的选择值的时候,发现当datagrid的行超过28行,就崩溃。下面把代码发出来。


xaml文件DataGrid的配置如下:
Plain Text code123456789101112131415161718 <DataGrid Margi……



截图上,我是想通过checkBox选择行,然后进行批量删除操作。
cheng2005 2012-11-08
  • 打赏
  • 举报
回复
DataGrid默认是打开 行虚拟化 的,所以在一个时刻并不是每一行都有UI元素的. 而且对于WPF来说,你的做法太土了.应该是绑定数据源,去遍历数据源,而不是遍历UI,不然将来UI有改动你还需要改逻辑.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧