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");
}
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的
RowState为
Deleted,而
Deleted
该状态表示该行不属于任何表,或则已经从表中分离出去了,不再属于任何表的
DataRow
对象。(相当于自由人),不能使用ImprotRow方法,所以使用dt.Rows.Add()方法