网站首页 > 知识剖析 正文
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是否有值,如果没有就把第一个选中,然后遍历这个选中的指标项,然后在命令窗口上打印出来,我们来看最终效果:
这样就拿到了用户多选的指标项,接下来就可以在项目中使用这些指标项做之后的操作。你学会了吗?
今天的分享就到这里,如果对你有帮助或者启发的话,请给我一个赞或者评论鼓励下我,你的支持是我不断更新的动力。
猜你喜欢
- 2025-09-24 vue面试题(自用)_vue面试题汇总
- 最近发表
-
- 不用Flexbox, 一行代码搞定CSS居中难题
- 使用 HTML、CSS 和 JS 创建令人惊叹的粒子背景效果
- CSS样式隔离:12个技巧让冲突率降低75%
- Python开发爬虫的常用技术架构_python网络爬虫开发
- DISMTools v0.5.1 Update 1_DISMTools v0.5.1 Update 16
- Spring MVC 完整配置指南:WebMvcConfigurer 实战全解析
- Python3 XML解析:探索数据交换与处理的高效工具(38)
- 《Java核心技术·卷 Ⅱ》知识点总结
- MyBatis3源码解析-执行SQL流程_mybatis3源码深度解析
- 印度计算机应急响应小组警告:谷歌Chrome、Zoho软件存在多个漏洞
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)