本文就来介绍如何给C1FlexGrid添加CheckBox列,在列头上添加CheckBox,以及选择CheckBox的问题。

 

在列头添加CheckBox

通过CellFactory功能给ColumnHeader添加CheckBox。

 为了添加到列头,需要重写CreateColumnHeaderContent,然后判断ColumnHeader的单元格是布尔类型,就设置CheckBox。

代码参考

public override void CreateColumnHeaderContent(C1FlexGrid grid, Border bdr, CellRange rng)
        {
            base.CreateColumnHeaderContent(grid, bdr, rng);

            if (grid.ColumnHeaders[rng.Row, rng.Column] is bool)
            {

                // it does, so create a checkbox to show/edit the value
                CheckBox chk = new CheckBox();
                chk.IsChecked = (bool?)grid.ColumnHeaders[rng.Row, rng.Column];
                chk.VerticalAlignment = VerticalAlignment.Center;
                chk.HorizontalAlignment = HorizontalAlignment.Center;
                ToolTipService.SetToolTip(chk, "This CheckBox represents a boolean value stored in a grid cell.");

                // assign the checkbox to the cell element (a Border)
                bdr.Child = chk;

                // connect the checkbox so it updates the content of the grid cell
                chk.Tag = grid;
                chk.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler(chk_Click));

            }

        }

如果要让CheckBox列的内容也是显示CheckBox,还需要重写CreateCellContent,判断是布尔类型,然后设置checkbox。

代码逻辑和列头设置CheckBox一致。

添加非绑定布尔类型列

通过Columns.Insert方法添加一个布尔类型的列在最左边。

代码参考:

Column c = new Column();
                c.DataType = typeof(bool);               
                _fgBound.Columns.Insert(0,c);

 

初始化布尔类型值

初始化的时候设置该列的值是false

代码参考:

_fgBound.ColumnHeaders[0, 0] = false;
                for (int index = 0; index < _fgBound.Rows.Count; index++)
                {
                    _fgBound[index, 0] = false;
                }

 

选择和反选

当选择/不选择列头的CheckBox的时候,该列的所有行的checkbox会做同步,这个时候就需要在重写的CreateColumnContent添加事件的处理。

当列头的CheckBox被选中或不选的时候,触发该事件,然后循环选择该列所有行。

步骤:

1.首先在CreateColumnContent里添加事件。

代码:

chk.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler(chk_Click));

2.事件处理

private void chk_Click(object sender, EventArgs e)
        {
            // get the checkbox that was clicked
            CheckBox chk = (CheckBox)sender;

            // get the grid that owns the checkbox
            C1FlexGrid flex = (C1FlexGrid)chk.Tag;

            // get the cell that contains the checkbox
            Border bdr = (Border)chk.Parent;

            ////int row = bdr.GetValue(Grid.RowProperty.GlobalIndex);
            //int row =(int) bdr.GetValue(Grid.RowProperty);
            int col = (int)bdr.GetValue(Grid.ColumnProperty);

            //// assign new value to the cell
            for (int i = 0; i < flex.Rows.Count; i++)
            {
                flex[i, col] = chk.IsChecked;
            }

        }

 

运行结果如图:

 

 

本文的源代码请下载CheckBoxes.zip (221.14 kb)

 

更多资源

C1FlexGrid在线英文产品文档地址: 

http://helpcentral.componentone.com/nethelp/C1FlexGridWPFSilv/ComponentOne%20FlexGrid%20for%20WPF%20and%20Silverlight.html

 

如果你对C1FlexGrid感兴趣,请到我们的官网下载最新版本:/download/?pid=6

如果你有疑问,可以到GCDN论坛获得技术支持:http://gcdn.grapecity.com.cn/showforum-138.html