积极答复者
如何在datagrid中插入checkbox,如何捕捉每行的checkbox的状态

问题
答案
-
楼主你好,
你可以自己写一个DataGridCheckBoxcolumn在column中加入CheckBox,也可以由数据源中的type让WPF自动为你实现CheckBox(当数据源type为bool时,WPF自动生成DataGridCheckboxColumn),然后找到某一行DataGridRow,再用递归方法在DataGridRow的visual tree中查打类型为CheckBox的元素,下面是一个小例子:
<Window.Resources>
<ObjectDataProvider x:Key="data"
MethodName="ShowData"
ObjectType="{x:Type local:DataClass}" />
</Window.Resources>
<StackPanel >
<dg:DataGrid Name="datagrid"
DataContext="{Binding Source={StaticResource data}}"
ItemsSource="{Binding}"
AutoGenerateColumns="True" >
</dg:DataGrid>
<Button Content="Button" Click="GetCheckBox" Height="30" />
</StackPanel>
In the code behind:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void GetCheckBox(object sender, RoutedEventArgs e)
{
var item1 = datagrid.SelectedItem;
DataGridRow item2 = datagrid.ItemContainerGenerator.ContainerFromItem(datagrid.SelectedItem) as DataGridRow;
var item3 = GetDescendantByType(item2, typeof(CheckBox));
}
public static Visual GetDescendantByType(Visual element, Type type)
{
if (element == null) return null;
if (element.GetType() == type) return element;
Visual foundElement = null;
if (element is FrameworkElement)
(element as FrameworkElement).ApplyTemplate();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
foundElement = GetDescendantByType(visual, type);
if (foundElement != null)
break;
}
return foundElement;
}
}
public class DataClass
{
public DataTable ShowData()
{
DataTable table = new DataTable();
table.Columns.Add("Flag", typeof(bool));
table.Columns.Add("ID");
table.Columns.Add("Name");
table.Rows.Add(new object[] { true, "ID1", "Name1" });
table.Rows.Add(new object[] { "False", "ID2", "Name2" });
table.Rows.Add(new object[] { "False", "ID3", "Name3" });
table.Rows.Add(new object[] { "True", "ID3", "Name4" });
return table;
}
}
如有疑问,请继续回复。
谢谢。
Jim Zhou -MSFT- 已标记为答案 爬完落地 2009年11月24日 6:33
全部回复
-
楼主你好,
你可以自己写一个DataGridCheckBoxcolumn在column中加入CheckBox,也可以由数据源中的type让WPF自动为你实现CheckBox(当数据源type为bool时,WPF自动生成DataGridCheckboxColumn),然后找到某一行DataGridRow,再用递归方法在DataGridRow的visual tree中查打类型为CheckBox的元素,下面是一个小例子:
<Window.Resources>
<ObjectDataProvider x:Key="data"
MethodName="ShowData"
ObjectType="{x:Type local:DataClass}" />
</Window.Resources>
<StackPanel >
<dg:DataGrid Name="datagrid"
DataContext="{Binding Source={StaticResource data}}"
ItemsSource="{Binding}"
AutoGenerateColumns="True" >
</dg:DataGrid>
<Button Content="Button" Click="GetCheckBox" Height="30" />
</StackPanel>
In the code behind:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void GetCheckBox(object sender, RoutedEventArgs e)
{
var item1 = datagrid.SelectedItem;
DataGridRow item2 = datagrid.ItemContainerGenerator.ContainerFromItem(datagrid.SelectedItem) as DataGridRow;
var item3 = GetDescendantByType(item2, typeof(CheckBox));
}
public static Visual GetDescendantByType(Visual element, Type type)
{
if (element == null) return null;
if (element.GetType() == type) return element;
Visual foundElement = null;
if (element is FrameworkElement)
(element as FrameworkElement).ApplyTemplate();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
foundElement = GetDescendantByType(visual, type);
if (foundElement != null)
break;
}
return foundElement;
}
}
public class DataClass
{
public DataTable ShowData()
{
DataTable table = new DataTable();
table.Columns.Add("Flag", typeof(bool));
table.Columns.Add("ID");
table.Columns.Add("Name");
table.Rows.Add(new object[] { true, "ID1", "Name1" });
table.Rows.Add(new object[] { "False", "ID2", "Name2" });
table.Rows.Add(new object[] { "False", "ID3", "Name3" });
table.Rows.Add(new object[] { "True", "ID3", "Name4" });
return table;
}
}
如有疑问,请继续回复。
谢谢。
Jim Zhou -MSFT- 已标记为答案 爬完落地 2009年11月24日 6:33