DevExpress控件使用之SearchLookUpEdit (多选)

基础版
作为SearchLookUpEdit最简单的用法,就是单选了。操作方案如下:
1.拖拽一个SearchLookUpEdit到界面上。修改Name为slue_selItemsId。
2.点开文本框右上三角,Design View设计,添加显示字段。
在这里插入图片描述
在这里插入图片描述

3.赋值如下:

	        listAllItems = CommonVar.g_AdviceItems.Clone();
            listAllItems = listAllItems.GroupBy(q => new { q.DrugCode, q.DrugName,q.PyCode,q.WbCode }).Select(q => new ViewDrug { DrugCode = q.Key.DrugCode, DrugName = q.Key.DrugName,PyCode=q.Key.PyCode,WbCode=q.Key.WbCode }).ToList();
            this.slue_selItemsId.Properties.DataSource = listAllItems;
            this.slue_selItemsId.Properties.DisplayMember = "DrugName";
            this.slue_selItemsId.Properties.ValueMember = "DrugCode";

即可实现效果,界面如下
在这里插入图片描述

点击文本框或者下拉,即可出现筛选框和筛选内容。
在筛选框里输入每一列的内容点击搜索皆可筛选(这个挺方便,但是列隐藏后不能筛选,例如想隐藏拼音码或五笔码筛选不了)
单击筛选行,可直接选中,将绑定的Text值显示到文本框,选中后弹出框自动关闭,通过EditValue得到选中的Value值。
清除为清除文本框选中的值。
左下角的“x”为关闭弹出框

PS:效果测试还行,满足单选筛选。但是这简单的功能GridLookUpEdit完全可以胜任了,而且界面更好看,不需要弹出框再筛选这么赘余的东西。所以单选不推荐用这个控件。以下是GridLookUpEdit的界面。
在这里插入图片描述

高级版
以上知,单选版完全没必要使用SearchLookUpEdit,所以它的价值在多选上,这是其他Dev控件无法胜任的功能。
总体效果如下:
使用步骤:

1.拖拽一个SearchLookUpEdit到界面上。修改Name为slue_selItemsId。
2.点开文本框右上三角,Design View设计,添加显示字段。
在这里插入图片描述
在这里插入图片描述

View中设置:
在这里插入图片描述

3.赋值如下

 listAllItems = CommonVar.g_AdviceItems.Clone();
            listAllItems = listAllItems.GroupBy(q => new { q.DrugCode, q.DrugName,q.PyCode }).Select(q => new ViewDrug { DrugCode = q.Key.DrugCode, DrugName = q.Key.DrugName,PyCode=q.Key.PyCode }).ToList();
             // 多选下拉筛选框的数据源是listAllItems,之后通过IsPicking属性判断是否选中
            this.slue_selItemsId.Properties.DataSource = listAllItems;
            this.slue_selItemsId.Properties.DisplayMember = "DrugName";
            this.slue_selItemsId.Properties.ValueMember = "DrugCode";

4.事件

        //选择项目时,动态显示选中个数
        public LabelControl searchResult = new LabelControl() { Text = "已选择 0 个项目。" };

        /// <summary>
        /// 多选筛选下拉框点Ok才存的Code
        /// </summary>
        private List<string> listSelDrugCode = new List<string>();
  
        #region 项目筛选框相关 

        // 弹出窗体,并动态添加控件(确认按钮,取消按钮,选中结果显示标签)
        // 窗体弹出事件
        private void slue_selItemsId_Properties_Popup(object sender, EventArgs e)
        {
            //得到当前SearchLookUpEdit弹出窗体
            PopupSearchLookUpEditForm form = (sender as IPopupControl).PopupWindow as PopupSearchLookUpEditForm;
            SearchEditLookUpPopup popup = form.Controls.OfType<SearchEditLookUpPopup>().FirstOrDefault();
            LayoutControl layout = popup.Controls.OfType<LayoutControl>().FirstOrDefault();
            //如果窗体内空间没有确认按钮,则自定义确认simplebutton,取消simplebutton,选中结果label
            if (layout.Controls.OfType<Control>().Where(ct => ct.Name == "btOK").FirstOrDefault() == null)
            {
                //得到空的空间
                EmptySpaceItem a = layout.Items.Where(it => it.TypeName == "EmptySpaceItem").FirstOrDefault() as EmptySpaceItem;

                //得到取消按钮的容器
                Control clearBtn = layout.Controls.OfType<Control>().Where(ct => ct.Name == "btClear").FirstOrDefault();
                LayoutControlItem clearLCI = (LayoutControlItem)layout.GetItemByControl(clearBtn);
                clearBtn.Click += clearBtn_Click;//重写的清除

                //添加一个simplebutton控件(确认按钮)
                LayoutControlItem myLCI = (LayoutControlItem)clearLCI.Owner.CreateLayoutItem(clearLCI.Parent);
                myLCI.TextVisible = false;
                SimpleButton btOK = new SimpleButton() { Name = "btOK", Text = "确定" };
                btOK.Click += btOK_Click;
                myLCI.Control = btOK;
                myLCI.SizeConstraintsType = SizeConstraintsType.Custom;//控件的大小设置为自定义
                myLCI.MaxSize = clearLCI.MaxSize;
                myLCI.MinSize = clearLCI.MinSize;
                myLCI.Move(clearLCI, DevExpress.XtraLayout.Utils.InsertType.Left);

                //添加一个label控件(选中结果显示)
                LayoutControlItem msgLCI = (LayoutControlItem)clearLCI.Owner.CreateLayoutItem(a.Parent);
                msgLCI.TextVisible = false;
                msgLCI.Control = searchResult;
                msgLCI.Move(a, DevExpress.XtraLayout.Utils.InsertType.Left);
                msgLCI.BestFitWeight = 100;
            }
        }

        /// <summary>
        /// 确定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btOK_Click(object sender, EventArgs e)
        {
            // 只有在点击确定按钮,才把勾选的临时值赋值给确定值listSelDrugCode
            listSelDrugCode = listAllItems.Where(q => q.IsPicking).Select(q => q.DrugCode).ToList();

            // 关闭方法会自动调用slue_selItemsId_Closed事件
            slue_selItemsId.ClosePopup();

            // 确定后筛选数据
            GirdViewFiler();
        }

        /// <summary>
        /// 重写的清除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void clearBtn_Click(object sender, EventArgs e)
        {
            // 清空确定值
            listSelDrugCode.Clear();
            // 调用关闭事件根据listSelDrugCode值,初始化多选下拉框
            slue_selItemsId_Closed(null, null);// 本应该先走清除按钮事件再走关闭事件的,可是不知道为啥竟然颠倒了,所以这里要手动调用关闭事件去初始化下拉框
            // 筛选数据
            GirdViewFiler();
        }

        /// <summary>
        /// 关闭
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void slue_selItemsId_Closed(object sender, DevExpress.XtraEditors.Controls.ClosedEventArgs e)
        {
            // 关闭后使下拉数据源控件数据源,选中状态,选中值和tip标签还原上次的保存的结果
            listAllItems.ForEach(q => q.IsPicking = listSelDrugCode.Contains(q.DrugCode));
            slue_selItemsId.ToolTip = string.Join(",", listAllItems.Where(q => q.IsPicking).Select(q => q.DrugName).ToList());
            slue_selItemsId.EditValue = string.Join(",", listAllItems.Where(q => q.IsPicking).Select(q => q.DrugName).ToList());
            searchResult.Text = $"已选择 {listAllItems.Count(q => q.IsPicking)} 项目。";
        }

        /// <summary>
        /// 项目选中行的改变事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void searchLookUpEdit1View_Click(object sender, EventArgs e)
        {
            // 获取选中行
            var gridView = sender as DevExpress.XtraGrid.Views.Grid.GridView;
            if (gridView == null) { return; }
            var selectedRow = gridView.GetFocusedRow() as ViewDrug;
            var listDataSource = gridView.DataSource as List<ViewDrug>;
            // 如果当前点击的列是复选框,就改变它的选中状态
            if (gridView.FocusedColumn.FieldName == "IsPicking")
            {
                selectedRow.IsPicking = !selectedRow.IsPicking;
            }
            // 更新选中数目的label显示
            int count = listDataSource.Where(q => q.IsPicking).Count();
            searchResult.Text = $"已选择 {count} 个项目。";
        }

        /// <summary>
        /// 自定义显示内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void slue_selItemsId_CustomDisplayText(object sender, DevExpress.XtraEditors.Controls.CustomDisplayTextEventArgs e)
        {
            if (listAllItems != null)
            {
                e.DisplayText = string.Join("、", listAllItems.Where(q => q.IsPicking).Select(q => q.DrugName).ToList());
            }
        }

        #endregion

5.最终效果
在这里插入图片描述
Demo地址

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Delphi DevExpress控件Devexpress公司旗下的用户界面套包,包含了数据录入、图表、数据分析、导航、布局等多种控件,可以帮助开发者创建出优秀的用户体验和高影响力的业务解决方案。同时,Delphi DevExpress控件还可以利用开发者现有的VCL技能为未来构建下一代应用程序。\[1\]\[2\] 要在Delphi中使用DevExpress控件,您需要按照以下步骤进行操作: 1. 下载并安装DevExpress VCL Controls套件。 2. 在Delphi中创建一个新项目。 3. 在项目中添加DevExpress控件单元,例如dxShellControls。 4. 在您的代码中使用DevExpress控件的类和方法来实现您的需求。 需要注意的是,如果您在C++Builder项目中使用DevExpress控件,并且禁用了"Disable incremental linker"和"Link with runtime packages"选项,那么在重新构建应用程序时可能会出现错误。\[3\] 希望这些信息对您有所帮助! #### 引用[.reference_title] - *1* *3* [Delphi开发工具DevExpress VCL全新发布v21.1.5](https://blog.csdn.net/AABBbaby/article/details/120409370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Delphi开发工具DevExpress VCL 2021年新版首发(附高速下载)](https://blog.csdn.net/AABBbaby/article/details/113307597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值