c# wpf datagrid中选择所有复选框的代码
Posted
技术标签:
【中文标题】c# wpf datagrid中选择所有复选框的代码【英文标题】:c# code for select all checkbox in wpf datagrid 【发布时间】:2010-10-19 20:29:36 【问题描述】:我需要一些 c# 代码来选择/取消选择 WPF 3.5 框架中数据网格中的所有复选框。 我想通过单击网格中的单个标题复选框来执行此操作。
请帮忙。
【问题讨论】:
【参考方案1】:这可以通过声明方式完成。下面为每一行创建一个复选框列,并且可以切换行选择。可以单击复选框列的标题以选择所有行。
xaml 中的相关部分
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit">
<toolkit:DataGrid Name="dataGrid"
ItemsSource="Binding" AutoGenerateColumns="True"
SelectionMode="Extended" CanResizeRows="False">
<toolkit:DataGrid.RowHeaderTemplate>
<DataTemplate>
<Grid>
<CheckBox IsChecked="
Binding Path=IsSelected,
Mode=TwoWay,
RelativeSource=RelativeSource FindAncestor,
AncestorType=x:Type toolkit:DataGridRow"
/>
</Grid>
</DataTemplate>
</toolkit:DataGrid.RowHeaderTemplate>
</toolkit:DataGrid>
</Window>
【讨论】:
【参考方案2】:这是我们在 .Net 4.0 XAML 文件中使用的示例数据网格:
<DataGrid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="Binding Path=TheMissingChildren" Style="StaticResource NameListGrid" SelectionChanged="DataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn CellStyle="StaticResource NameListCol">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="Binding Path=Checked, UpdateSourceTrigger=PropertyChanged" Name="theCheckbox"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="Binding Path=SKU" Header="Album" CellStyle="StaticResource NameListCol"/>
<DataGridTextColumn Binding="Binding Path=Name" Header="Name" CellStyle="StaticResource NameListCol"/>
<DataGridTextColumn Binding="Binding Path=Pronunciation" Header="Pronunciation" CellStyle="StaticResource NameListCol"/>
</DataGrid.Columns>
</DataGrid>
下面是代码:
private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked)
foreach (CheckedMusicFile mf in TheMissingChildren)
mf.Checked = IsChecked;
dgMissingNames.Items.Refresh();
private void CheckBox_Checked(object sender, RoutedEventArgs e)
HeadCheck(sender, e, true);
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
HeadCheck(sender, e, false);
TheMissingChildren 是一个简单的对象结构,具有一些字符串属性和一个 ischecked 布尔值。
HTH。
【讨论】:
如果您不打算在 HeadCheck 中使用 sender 对象或 routedeventargs,则不应将它们传入UpdateSourceTrigger=PropertyChanged
确实对我有帮助。谢谢。【参考方案3】:
这是基于我不记得的其他人的来源,但我们使用它来帮助查找某种类型的视觉子项。对于这种情况,它可能不是最有效的用法,但它可能会帮助您走上正轨。
public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
return null;
[编辑 4.16.09] 在此基础上,试试这个方法。应该找到所有 CheckBox 并更改提供的状态,可从您的事件处理程序对 Checked/Unchecked 事件调用。
public static void CheckAllBoxes(DependencyObject obj, bool isChecked)
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
// If a checkbox, change IsChecked and continue.
if (obj is CheckBox)
((CheckBox) obj).IsChecked = isChecked;
continue;
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
CheckAllBoxes(child, isChecked);
【讨论】:
【参考方案4】:我会使用 WPF 中的新数据绑定功能。为所有复选框的 IsChecked 属性提供单向绑定,绑定源是主复选框的 IsChecked 属性。
另一种选择是使用触发器
【讨论】:
【参考方案5】:DataColumn dt = null;
for (int i = 0; i < dataGrid.Columns.Count; i++)
dt = new DataColumn("Column Name");
dt.DataType = typeof(Boolean);
dt.DefaultValue = false;
dataTable.Add(dt);
dataGied.DataContext = dataTable;
<Custom:DataGrid x:Name="dataGrid" AutoGenerateColumns="True" ItemsSource="Binding" />
这只是一个粗略的想法,希望这可行
【讨论】:
以上是关于c# wpf datagrid中选择所有复选框的代码的主要内容,如果未能解决你的问题,请参考以下文章