DevExpress Winform SearchGridLookUpEdit多选简单设置

本文介绍如何通过DevExpress的SearchLookUpEdit控件的自定义逻辑,扩展其多列选择功能,包括设置复选框列、保存选择数据和修改显示文本。通过CustomDisplayText事件实现根据用户选择动态显示内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DevExpress提供了不少的下拉编辑框,而且样式和功能都非常的强大,不像原生的控件,只有一个ComboBox,仅仅支持单列,多列的情况往往都得自己写。

DevExpress在拥有ComboBoxEdit这种类似原生控件的同时还提供了其他的丰富多样的下拉编辑框:

比如常用的可以绑定数据源而且支持多列显示的LookUpEdit,GridLookUpEdit,SearchLookUpEdit,还有CheckedComboBoxEdit这种可以多选的下拉边框框等等,不过虽然CheckedComboBoxEdit虽然支持多选,但还是只能显示单列,不能满足我们复杂的显示要求,所以要么利用Dev提供的PopupContainerEdit+PopupContainerControl+GridControl组合成属于自己的下拉多列多选的控件,要么就改良一下GridLookUpEdit或者SearchLookUpEdit。

众所周知,这两个控件都是单选的,细心的人员可能能看出来,其实这两个控件的下拉窗口里面的列表其实是用来GridControl来显示的,我们可以在Properties属性里面找到PopupView(早先的版本没有这个属性,但有View的属性),这个属性返回的正式GridView。

知道结构后,我们利用GridView的复选框列来改良我们的SearchLookUpEdit,使其能够实现多选的操作;

简单说一下过程逻辑:

1、显示复选框列

2、下拉框界面关闭的时候获取列表选择的数据并且存放起来

3、利用CustomDisplayText事件,根据选择的数据,利用指定符号拼接起来,设置编辑框的Text

了解这个逻辑就直接写代码:

 /// <summary>
        /// 设置SearchGridLookUpEdit控件可以多选
        /// </summary>
        /// <param name="edit"></param>
        /// <param name="separator"></param>
        public static void SetSearchGridLookUpEditMultiSelect(DevExpress.XtraEditors.GridLookUpEditBase edit, string separator = ",")
        {
            var view = edit.Properties.PopupView as DevExpress.XtraGrid.Views.Grid.GridView;
            view.OptionsSelection.MultiSelect = true;
            view.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CheckBoxRowSelect;
            view.OptionsSelection.CheckBoxSelectorColumnWidth = 45;
            var values = new List<string>();
            edit.Properties.Tag = values;//将集合存放在Tag,如果想获取选择的集合,可以直接取Tag再转换
            //下拉框显示时候勾选,可以用于初始值设置或者如果在GridView中的使用
            edit.Popup += (s, e) =>
            {
                //view.ClearSelection();
                //view.BeginSelection();
                //for(int i = 0; i < view.RowCount; i++)
                //{
                //    var value=view.GetRowCellDisplayText(i, edit.Properties.DisplayMember);
                //    if (values.Contains(value))
                //    {
                //        view.SelectRow(i);
                //    }
                //}
                //view.EndSelection();
            };
            //关闭下拉框的时候获取选中的集合
            edit.CloseUp += (s, e) =>
            {
                values.Clear();
                var indexs = view.GetSelectedRows();
                foreach (var index in indexs)
                {
                    var value = view.GetRowCellDisplayText(index, edit.Properties.DisplayMember);
                    values.Add(value);
                }
                edit.RefreshEditValue();
            };
            //根据选中的集合设置显示文本并且用符号拼接起来
            edit.Properties.CustomDisplayText += (s, e) =>
            {
                if (!edit.IsPopupOpen)
                    e.DisplayText = string.Join(separator, values.ToArray());
            };
        }

示例代码:

public Form1()
        {
            InitializeComponent();

            gridLookUpEdit2.Properties.DataSource = CreateDt();
            gridLookUpEdit2.Properties.DisplayMember = "name";
            gridLookUpEdit2.Properties.ValueMember = "id";
            SetSearchGridLookUpEditMultiSelect(gridLookUpEdit2);
        }
        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;
        }

演示:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值