GridView利用CheckBox复选框列实现单选功能
大家好,又见面了,我是你们的朋友全栈君。
自Dev13.2开始,GridView提供了自带的复选框列,该功能能实现多选操作,方便了不少,那如果想把这个自带的复选框列做成单选,那就需要单独处理了。
先补充一下,GridView的复选框列怎么设置,如下代码片段,只要设置前面两个属性即可在GridView看到有一列复选框(BandedGridView较老版本不支持这个功能,应该得在19.2或者20之后的版本才支持,具体可以看看自己的版本,如果设置无效,那么说明不支持):
//设置显示复选框列
gridview.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CheckBoxRowSelect;
gridview.OptionsSelection.MultiSelect = true;
gridview.OptionsSelection.CheckBoxSelectorColumnWidth = 45;//设置复选框列的宽度
了解如何显示复选框列,那么想实现单选的功能就需要检测选择操作时候对其他行的CheckBox进行取消选择,GridView提供了一个SelectionChanged事件,我们只需要在这个事件监听这个操作,每次触发的时候清除所有选择行(gridView.ClearSelection())然后再选择当前行即可,直接上代码:
/// <summary>
/// 设置GridView单选
/// </summary>
/// <param name="view"></param>
/// <param name="selectCaption"></param>
public static void SetGridViewSingleSelect(DevExpress.XtraGrid.Views.Grid.GridView view,string selectCaption="选择")
if (view == null) return;
//设置显示复选框列
view.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CheckBoxRowSelect;
view.OptionsSelection.MultiSelect = true;
view.OptionsSelection.CheckBoxSelectorColumnWidth = 45;
view.OptionsSelection.ShowCheckBoxSelectorInColumnHeader = DevExpress.Utils.DefaultBoolean.False;//列标题不显示CheckBox,控制不能全选
var selectCol=view.VisibleColumns[0];
if(selectCol.FieldName== "DX$CheckboxSelectorColumn")
selectCol.Caption = selectCaption;
view.SelectionChanged += onSelectChanged;
void onSelectChanged(object sender , DevExpress.Data.SelectionChangedEventArgs e)
//注销事件,防止以下操作反复触发该事件
view.SelectionChanged -= onSelectChanged;
//清除所有选择
view.ClearSelection();
if (e.Action == CollectionChangeAction.Add)//选中
view.SelectRow(e.ControllerRow);
else if (e.Action == CollectionChangeAction.Remove)//取消选中
view.UnselectRow(e.ControllerRow);
view.SelectionChanged += onSelectChanged;
}
如果需求是不可以允许不选的话,不需要代码中的两个条件语句,直接view.ClearSelection()后调用view.SelectRow(e.ControllerRow)即可。
示例、代码如下:
public Form1()
InitializeComponent();
SetGridViewSingleSelect(gridView1);
gridControl1.DataSource = CreateDt();
DataTable CreateDt()
var dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name");