大家好,又见面了,我是你们的朋友全栈君。
自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");
for (int i = 0; i < 20; i++)
{
dt.Rows.Add(i, "name" + i);
}
return dt;
}
结果演示:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139340.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...