none
如何在datagrid中插入checkbox,如何捕捉每行的checkbox的状态 RRS feed

  • 问题

  • 从数据库中取得数据,显示在datagrid上,在每行的第一列,加入复选框,现在问题是如何捕捉到每行第一列的值,也就是我想知道,每行的复选框是否选中,有谁能告诉我如何实现。谢谢。

    2009年11月17日 0:21

答案

  • 楼主你好,

    你可以自己写一个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月23日 8:08
    版主

全部回复

  • 楼主你好,

    你可以自己写一个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月23日 8:08
    版主
  • 楼主你好,
    很高兴我的解决方案对你有用,如有其他疑问,请继续回复,谢谢。


    Jim Zhou -MSFT
    2009年11月24日 8:02
    版主