Dev——手把手教你学会CheckedListBox(C#)
xsobi 2025-01-01 23:14 1 浏览
CheckedListBox是一个多选择器控件,是DevExpress提供的用以解决多选情况下的解决方案。
首先,我们需要一个面板Panel承载CheckedListBox,Panel使用DevExpress提供的PanelControl控件,设置停靠方式为在父容器上停靠,用代码控制为:this.PanelControl1.Dock=DockStyle.Fill,然后将CheckedListBox拖拽到Panel面板上,设置停靠方式为在父容器上停靠,最终效果如下即为正确:
于是,我们需要初始化CheckedListBox,为其中加入我们需要添加的选择项。第一步我们先清空CheckedListBox的选择项,这样做是为了方便下次可以刷新。代码写为:
this.checkedListBoxControl1.Items.Clear();
接下来我们给CheckedListBox上添加选择项,当然可以一个一个添加,但是这里给出的解决方案是定义一个枚举类,先来看这个枚举类怎么定义的。这里给出石油生产的相关指标项。
public enum ProdQuotaEnum
{
/// <summary>
/// 日产油
/// </summary>
[Display(Name = "日产油水平")]
[Group(GroupName = "0")]
DailyOil,
/// <summary>
/// 单井日产油水平
/// </summary>
[Display(Name = "单井日产油水平")]
[Group(GroupName = "0")]
WellDailyOil,
/// <summary>
/// 单井日产油能力
/// </summary>
[Display(Name = "单井日产油能力")]
[Group(GroupName = "0")]
WellDailyOilAbility,
/// <summary>
/// 平均单井日产油
/// </summary>
[Display(Name = "平均单井日产油水平")]
[Group(GroupName = "0")]
AverageDailyOil,
/// <summary>
/// 综合含水
/// </summary>
[Display(Name = "综合含水")]
[Group(GroupName = "0")]
TotalWaterCut,
/// <summary>
/// 注采比
/// </summary>
[Display(Name = "注采比")]
[Group(GroupName = "0")]
InjProdRatio,
/// <summary>
/// 综合生产油气比
/// </summary>
[Display(Name = "综合生产气油比")]
[Group(GroupName = "0")]
CompreProdRatio,
/// <summary>
/// 原油计量系统误差(输差)
/// </summary>
[Display(Name = "原油计量系统误差(输差)")]
[Group(GroupName = "0")]
CrudeOilMeteringSystemError}
}
其中Display属性提供允许实体分部类的类型和成员指定可本地化字符串的通用特性。Group属性是分组属性,可以用于一个枚举类上有多个种类的指标项,这样就可以筛选出多种选择项。但是CheckedListBox需要显示指标内容,于是我们需要获取枚举类的Display属性,这样我们需要额外定义一个工具类:AttributeHelper类。
public static IEnumerable<T> GetEnumWithKey<T>(T t, string groupName)
{
var list = new List<T>();
Type type = t.GetType();
if (!type.IsEnum) return list;
foreach (FieldInfo fd in type.GetFields())
{
object[] attrs = fd.GetCustomAttributes(typeof(GroupAttribute), false);
if (attrs != null && attrs.Length > 0 && (attrs[0] as GroupAttribute).GroupName == groupName)
{
list.Add((T)fd.GetRawConstantValue());
}
} return list;
}
这个方法是根据Group的值来映射出枚举类的Display属性值,但是用于CheckedListBox显示出指标内容,那么我们还需定义一个取display属性的方法:
public static string GetEnumDisplayName<T>(T t)
{
Type type = t.GetType();
if (!type.IsEnum) return string.Empty;
FieldInfo fd = type.GetField(t.ToString());
if (fd == null)
return string.Empty;
object[] attrs = fd.GetCustomAttributes(typeof(DisplayAttribute), false);
string name = string.Empty;
foreach (DisplayAttribute attr in attrs)
{
name = attr.Name;
break;
}
return name;
}
准备好枚举类和取枚举类的属性工具类之后,就可以添加指标项了。代码这样写:
var enumList1 = AttributeHelper.GetEnumWithKey(ProdQuotaEnum.AverageDailyOil, "0"); foreach (var item in enumList1) { this.checkedListBoxControl1.Items.Add(new CheckedListBoxItem()
{
Description = AttributeHelper.GetEnumDisplayName(item),
Tag = item
});
}
GetEnumWithKey方法的参数为枚举类,以及Group属性值,获取到枚举类之后,然后遍历这个列表,然后将属性值一个一个地写入CheckedListBox,每一个选择项都是一个CheckedListBoxItem的对象,于是我们可以将Description属性设为Display属性,Tag设为每一个枚举类的值。写好这个我们运行下看下效果:
可以看到指标项都添加进去了,然后我们需要进行多选,那么我们首先定义个迭代属性对象,用于保存用户选择的指标项。如下:
private IEnumerable<CheckedListBoxItem> selectItems = new List<CheckedListBoxItem>();
接着我们需要定义CheckedListBox的选择事件,这里给出代码:
this.checkedListBoxControl1.ItemCheck += CheckedListBoxControl1_ItemCheck;
private void CheckedListBoxControl1_ItemCheck(object sender, DevExpress.XtraEditors.Controls.ItemCheckEventArgs e)
{
this.UpdateSelectItems();
}
这里给方法里定义了一个UpdateSelectItems,用于实现用户每次点击之后程序获取用户的选择项,我们接下来就把这个方法实现下:
private void UpdateSelectItems()
{
selectItems = this.checkedListBoxControl1.Items.Where(x => x.CheckState == CheckState.Checked);
if (!selectItems.Any())
this.checkedListBoxControl1.Items[0].CheckState = CheckState.Checked;
foreach(var item in selectItems)
{
Console.Write(item.Description + ",");
}
}
在这个方法中,第一行使用Where子句筛选出已经选中的指标项,第二句用于判断selectItems是否有值,如果没有就把第一个选中,然后遍历这个选中的指标项,然后在命令窗口上打印出来,我们来看最终效果:
这样就拿到了用户多选的指标项,接下来就可以在项目中使用这些指标项做之后的操作。你学会了吗?
今天的分享就到这里,如果对你有帮助或者启发的话,请给我一个赞或者评论鼓励下我,你的支持是我不断更新的动力。
相关推荐
- MySQL 正则表达式最全介绍
-
MySQL支持使用正则表达式进行模式匹配和文本搜索。正则表达式提供了一种强大的工具,可以用来匹配和检索字符串中的复杂模式。MySQL中的正则表达式功能主要在REGEXP或RLIKE运算符中使用。1....
- 正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思
-
Q:经常看见的正则前面的(?i)(?s)(?m)(?is)(?im)是什么意思?...
- SQL中的正则表达式
-
正则表达式通常用来匹配字符,比如在一段字符中截取我们想要的字符,又或者将不想要的字符串替换,或者统计某个或者某几个字符出现的次数,我们都可以使用Oracle提供的正则表达式语法来完成。1.比如,我们在...
- 学习VBA,报表做到飞 第四章 正则表达式 4.10 贪婪模式与懒惰模式
-
第四章正则表达式4.10贪婪模式与懒惰模式正则表达式匹配时默认为贪婪模式,也就是尽可能多的匹配。有时候我们需要对符合条件的内容分开匹配,就要用到懒惰模式。...
- Python re模块 正则表达式之compile函数
-
一、应用场景为了重复利用同一个正则对象,需要多次使用这个正则表达式的话,使用re.compile()保存这个正则对象以便复用,可以让程序更加高效。二、使用方法...
- 几条常用的JavaScript正则表达式
-
在做项目或者代码编写过程中,一般会遇到验证电话、邮箱等格式是否正确合法的问题。通常我们会使用正则表达式,自己写很麻烦,且正则表达式又不是那么容易记住。所以现在分享几条常用的正则表达式,需要的时候直接复...
- C语言中使用正则表达式
-
POSIX规定了正则表达式的C语言库函数,参见regex(3),我们已经学了很多C函数的用法读者应该具备自己看懂man手册的能力C语言中使用正则表达式一般分为三步:1.编译正则表达式regco...
- VBA与Excel入门系列-12-正则表达式(上篇)
-
系统环境:Windows10...
- 系列专栏(八):JS的第七种基本类型Symbols
-
ES6作为新一代JavaScript标准,已正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,MozillaWeb开发者博客推出了《ES6InDepth》系列文章。CSDN...
- EXCEL正则表达式的基础语法
-
正则表达式的基本概念及用途了解之后,我们就来学习下具体的语法,先以一个简单的例子来讲解。基础语法:比如,A1单元格中有一串字符:aabbccdd...
- 这几个冷门到你没听过的App,好用到为你打开新世界大门
-
一些好用的App总被埋没在数以百万计的应用商店中。今天为大家推荐几款Windows、Android、iOS、macOS平台里略显小众、但足够好用的遗珠App。万彩办公大师(Windows)转换Offi...
- C/C++知识分享:C语言正则表达式
-
C语言的正则表达式规则,特此跟大家分享。一、C语言如何使用正则表达式?C语言使用正则表达式的方法很简单,只需要包含正则表达式头文件即可:...
- Github工具库(二)
-
作者:Yunying...
- 在 JavaScript 中替换所有指定字符 3 种方法
-
在JS没有提供一种简便的方法来替换所有指定字符。在Java中有一个replaceAll(),replaceAll(Stringregex,Stringreplacement))方法...
- 正则表达式进阶
-
正则表达式,是每个程序员的必备的技能1.贪婪匹配和惰性匹配...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- patch补丁 (31)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- firebug 使用 (31)
- characterencodingfilter (33)
- getmonth (34)
- hibernate教程 (31)
- label换行 (33)
- curlpost (31)
- android studio 3 0 (34)
- android应用开发 (31)
- html转js (35)
- 索引的作用 (33)
- css3 0 (31)
- checkedlistbox (34)
- localhost 8080 (32)
- 多态 (32)
- net开发 (31)