C#开发学习笔记:向Dev控件库中的GridControl添加自定义复选框

Dev控件库自带的有复选框列,默认是不显示状态,如果需要则设置相关的两个属性:
	//设置grid显示选择列
        gridview.OptionsSelection.MultiSelect = true;
        gridview.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;


向Dev控件库中的GridControl添加自定义复选框

1.用代码添加:

 //设置grid数据行可以多选
        gridview.OptionsSelection.MultiSelect = true;//设置数据行可以多行选择
        gridview.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect;//设置选中一整行
        DevExpress.XtraGrid.Columns.GridColumn col = new DevExpress.XtraGrid.Columns.GridColumn();
        col.FieldName = "Selection";
        col.Caption = "选择";
        col.VisibleIndex = 0;//设置列显示顺序,0表示显示为第一列
        col.SortMode = DevExpress.XtraGrid.ColumnSortMode.Value;
        col.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
        col.ColumnEdit = new RepositoryItemCheckEdit() //绑定该列为复选框列(checkedit控件)
        {
              NullStyle=DevExpress.XtraEditors.Controls.StyleIndeterminate.Unchecked,//设置未选中时,复选框的样子
              ValueChecked ="True",//设置选中时的value值
              ValueUnchecked = "False"//设置未选中时value的值
        };
        col.UnboundType = DevExpress.Data.UnboundColumnType.Boolean;//设置数据绑定的类型为boolean类型
        col.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near;                
        gridview.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;//设置列标题居中
        gridview.Columns.Add(col);
        col.AbsoluteIndex = 0;//由于数据源有隐藏列(会导致列重新排序),所以需要设置该属性为0(将添加的设置为第一列)
	DataTable dt = new DataTable();
        foreach (DevExpress.XtraGrid.Columns.GridColumn item in gridview.Columns)
        {
            if (item.Caption == "选择")
            {
                 dt.Columns.Add(item.FieldName);
                 break;
            }
        }
	//将dt与数据源合并(相当于将复选框列填加到数据源)
        ds.Tables[0].Merge(dt);
        gridcontrol.DataSource = ds.Tables[0];

在添加列时,遇见了选中复选框后,鼠标焦点移到其他cell时,复选框状态又还原为未选中状态(一开始未绑定数据源),查找资料之后添加了绑定复选框列;到数据源的代码,测试时问题依然存在,后来发现原因为在绑定列为复选框时,没有绑定ValueChecked 和ValueUnchecked的值 (这两个值我绑定的为String类型,用Run Designer添加列自动为Boolean类型,不知道是否为版本原因(我使用的是15.2.10,其他人使用的是低版本),其他人不修改这两个属性的值类型为String也不会出现上述问题,而我的却会出现)

2,直接使用Grid的Run Designer添加

可以参考http://blog.csdn.net/jiankunking/article/details/17992063

3.当cell的值改变时设置复选框为选中状态

   	private void gridView1_CellValueChanging(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {           
            gridView1.SetRowCellValue(e.RowHandle,gridView1.Columns.ColumnByFieldName("Selection"), "True");
        }

4.获取Grid中新增的选中的数据

        DataTable dt = new DataTable();
        DataTable result_dt = new DataTable();
        try
        {               
             int[] RowHandle = gridview.GetSelectedRows();
             dt=gridview.GetFocusedDataRow().Table;
             result_dt.Merge(gridview.GetFocusedDataRow().Table);
             result_dt.Clear();
             //将新增的数据行添加到dt数据表
             for (int i = 0; i < RowHandle.Count(); i++)
             {
                if (gridview.GetDataRow(RowHandle[i]) != null)
                     dt.Rows.Add(gridview.GetDataRow(RowHandle[i]));
             }
             //将选中的数据过滤出来(通过添加的选择列过滤)
             foreach (DataRow dr in dt.Rows)
             {
                 if(dr["Selection"]=="True")
                      result_dt.ImportRow(dr);
             }                
         }
一开始使用的获取数据行的代码是DataRow dr = gridview.GetFocusedDataRow();这样确实可以获取到数据行(只针对一行数据而言,如果是新增多行数据,则使用上面的方法),但是在使用dt.ImportRow(dr)时发现dr并没有添加到表中,原因是dr的 RowStateDeleted,Deleted 该状态表示该行不属于任何表,或则已经从表中分离出去了,不再属于任何表的 DataRow 对象。(相当于自由人),不能使用ImprotRow方法,所以使用dt.Rows.Add()方法





你可能感兴趣的:(C#开发学习笔记)