• Winform开发中使用下拉列表展示字典数据的几种方式


    Winform开发中中,我们为了方便客户选择,往往使用系统的字典数据选择,毕竟选择总比输入来的快捷、统一,一般我们都会简单封装一下,以便方便对控件的字典值进行展示处理,本篇随笔介绍DevExpress控件的几种常见的字典绑定展示方式,希望我们在实际WInform项目中使用到。

    1、常规下拉列表的处理


    常规的处理方式,可能会使用ComboBoxEdit 控件来承载下拉列表,下拉列表的值可以是固定的列表,也可以来自字典的方式,具体根据实际情况而定,大概的效果如下所示。

     单击下拉列表,会展示一些常规的字典项目,如下效果所示。

    如果使用控件原始方式,我们绑定控件的下拉列表值的做法如下所示。

    1. combo.Properties.BeginUpdate();//可以加快
    2. combo.Properties.Items.Clear();
    3. combo.Properties.Items.AddRange(itemList);
    4. combo.Properties.EndUpdate();//可以加快

     不过我们一般倾向于高效率的界面处理,一般会编写各类型的界面控件的扩展函数用于快速处理。

     

    不同类型的控件我们用一个独立的扩展文件来处理,这样方便维护的同时,也方便借鉴完善。

    例如对于上面的控件,我们的绑定方法的扩展函数如下所示。

    1. /// <summary>
    2. /// 绑定下拉列表控件为指定的数据字典列表
    3. /// </summary>
    4. /// <param name="combo">下拉列表控件</param>
    5. /// <param name="itemList">数据字典列表</param>
    6. /// <param name="defaultValue">控件默认值</param>
    7. /// <param name="emptyFlag">是否加入空值选项</param>
    8. public static void BindDictItems(this ComboBoxEdit combo, List<CListItem> itemList, string defaultValue, bool emptyFlag = true)
    9. {
    10. combo.Properties.BeginUpdate();//可以加快
    11. combo.Properties.Items.Clear();
    12. combo.Properties.Items.AddRange(itemList);
    13. if (emptyFlag)
    14. {
    15. combo.Properties.Items.Insert(0, new CListItem(""));
    16. }
    17. if (itemList.Count > 0)
    18. {
    19. if (!string.IsNullOrEmpty(defaultValue))
    20. {
    21. combo.SetComboBoxItem(defaultValue);
    22. }
    23. else
    24. {
    25. combo.SelectedIndex = 0;
    26. }
    27. }
    28. combo.Properties.EndUpdate();//可以加快
    29. }

    其中方法增加了一些默认值以及是否追加空白项目的处理。

    当然,我们为了适应各种数据源的绑定方式,我们重载了很多不同的函数处理,如下截图所示。

     当然对于其他同类型的下列列表控件也是这样处理即可。这样界面上,我们就可以指定调用绑定的处理操作了

    1. private void InitDictItem()
    2. {
    3. this.txtManufacture.Items.Clear();
    4. this.txtManufacture.Items.AddRange(DictItemUtil.GetDictByDictType("供货商"));
    5. this.txtBigType.Items.Clear();
    6. this.txtBigType.Items.AddRange(DictItemUtil.GetDictByDictType("备件属类"));
    7. }

    或者,我们可以根据字典的类型,来进一步做一个扩展函数,来简化绑定的处理。

    1. /// <summary>
    2. /// 绑定下拉列表控件为指定的数据字典列表
    3. /// </summary>
    4. /// <param name="control">下拉列表控件</param>
    5. /// <param name="dictTypeName">数据字典类型名称</param>
    6. /// <param name="defaultValue">控件默认值</param>
    7. /// <param name="emptyFlag">是否添加空行</param>
    8. public static void BindDictItems(this ComboBoxEdit control, string dictTypeName, string defaultValue, bool emptyFlag = true)
    9. {
    10. Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
    11. List<CListItem> itemList = new List<CListItem>();
    12. foreach (string key in dict.Keys)
    13. {
    14. itemList.Add(new CListItem(key, dict[key]));
    15. }
    16. control.BindDictItems(itemList, defaultValue, emptyFlag);
    17. }

    使用了这些简化的扩展函数,我们可以对系统的字典,根据字典类型来进行绑定了。

    1. private void InitDictItem()
    2. {
    3. this.txtManufacture.BindDictItems("供货商");
    4. this.txtSearchManufacture.BindDictItems("供货商");
    5. this.txtSearchDept.BindDictItems("部门");
    6. }

    如上代码所示,简化了很多处理,就一个函数就可以绑定了系统字典类型的下拉列表了。

    2、带序号的GridLookUpEdit下拉列表

    有时候,我们在一些常见的系统里面,经常看到一些带有序号的下拉列表,其实里面就是一个GridControl的控件,我们只需要赋值对应的列表数据源,以及设置显示的列内容,并重写下序号的展示处理就可以实现了。

    我们先来看看实际的效果。

     上面的列表是一个GridControl的内在控件,我们使用这个 GridLookUpEdit下拉列表控件的时候,设置好GridControl的数据源和显示的列就基本上可以了。

    1. //绑定数据源和显示的内容、隐藏值
    2. this.txtProjectList.Properties.DataSource = list;
    3. this.txtProjectList.Properties.ValueMember = "Value";
    4. this.txtProjectList.Properties.DisplayMember = "Text";
    5. //设置Grid显示的列信息
    6. var columns = new List<LookUpColumnInfo>()
    7. {
    8. new LookUpColumnInfo("Value", "显示名称")
    9. };
    10. for (int i = 0; i < columns.Count; i++)
    11. {
    12. this.txtProjectList.Properties.View.CreateColumn(columns[i].FieldName, columns[i].Caption,
    13. columns[i].Width, true, UnboundColumnType.Bound, DefaultBoolean.False, FixedStyle.None);
    14. }
    15. //其他属性设置
    16. this.txtProjectList.Properties.ImmediatePopup = true;
    17. this.txtProjectList.Properties.TextEditStyle = TextEditStyles.Standard;
    18. this.txtProjectList.Properties.PopupWidthMode = DevExpress.XtraEditors.PopupWidthMode.ContentWidth;
    19. //设定列表的序号的宽度和显示文本
    20. this.txtProjectList.Properties.View.IndicatorWidth = 40;
    21. this.txtProjectList.Properties.View.CustomDrawRowIndicator += (s, e) =>
    22. {
    23. if (e.Info.IsRowIndicator && e.RowHandle >= 0)
    24. {
    25. e.Info.DisplayText = (e.RowHandle + 1).ToString();
    26. }
    27. };

    那么如果我们需要使用扩展函数来简化实际的代码,那么应该如何封装这个GridLookupEdit的下列控件呢,我们编写的扩展函数代码如下所示。

    1. /// <summary>
    2. /// 绑定控件的数据源
    3. /// </summary>
    4. /// <param name="lookup">控件对象</param>
    5. /// <param name="dataSource">数据源</param>
    6. /// <param name="displayMember">显示字段</param>
    7. /// <param name="valueMember">值字段</param>
    8. /// <param name="showRowIndicator">是否显示序号</param>
    9. /// <param name="lookUpColumnInfos">显示的列</param>
    10. /// <returns></returns>
    11. public static object BindDictItems(this GridLookUpEdit lookup, object dataSource, string displayMember, string valueMember, bool showRowIndicator = true, params LookUpColumnInfo[] lookUpColumnInfos)
    12. {
    13. lookup.Properties.DataSource = dataSource;
    14. lookup.Properties.DisplayMember = displayMember;
    15. lookup.Properties.ValueMember = valueMember;
    16. lookup.Properties.View.Columns.Clear();
    17. for (int i = 0; i < lookUpColumnInfos.Length; i++)
    18. {
    19. lookup.Properties.View.CreateColumn(lookUpColumnInfos[i].FieldName, lookUpColumnInfos[i].Caption,
    20. lookUpColumnInfos[i].Width, true, UnboundColumnType.Bound, DefaultBoolean.False, FixedStyle.None);
    21. }
    22. lookup.Properties.ImmediatePopup = true;
    23. lookup.Properties.TextEditStyle = TextEditStyles.Standard;
    24. if (showRowIndicator)
    25. {
    26. lookup.Properties.View.IndicatorWidth = 40;
    27. //重写序号显示,默认不显示数值
    28. lookup.Properties.View.CustomDrawRowIndicator += (s, e) =>
    29. {
    30. if (e.Info.IsRowIndicator && e.RowHandle >= 0)
    31. {
    32. e.Info.DisplayText = (e.RowHandle + 1).ToString();
    33. }
    34. };
    35. }
    36. return dataSource;
    37. }

    这样处理后,界面上简化了不少代码,如下使用代码所示。

    1. var list = DictItemUtil.GetDictByDictType("备件类别");
    2. var columns = new List<LookUpColumnInfo>()
    3. {
    4. new LookUpColumnInfo("Value", "显示名称")
    5. };
    6. this.txtProjectList2.BindDictItems(list, "Text", "Value", true, columns.ToArray());

    通过上面的两种方式,我们可以得到常见的两种下拉列表的数据绑定展示方式。

     

     

     而对于其他类似的下拉列表,如树形列表,带搜索的SearchLookupEdit等控件,我们也可以用类似的方式编写自定义的扩展函数,这样我们使用起来就非常方便的了。类似我们下面的做法方式,分门别类的对它们进行一些简单的封装处理。

    以上就是我们对于常见控件使用的一些微薄经验,希望大家有所借鉴。

  • 相关阅读:
    xml schema
    Effective Modern C++[实践]->使用 override 关键字声明要重写的函数
    Redis哨兵模式配置文件详解
    网络基础学习系列三http
    妙啊!纯 CSS 实现拼图游戏
    (免费领源码)Java#SpringBoot#mysql高校实验室资产管理系统85189-计算机毕业设计项目选题推荐
    Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
    【老生谈算法】matlab实现功率谱估计分析算法源码——功率谱估计分析
    python入门与实战--字符串
    (学习日记)2022.7.26
  • 原文地址:https://blog.csdn.net/lwf3115841/article/details/127755248