C#.Net自定义控件 - CheckedListBoxEditor(支持多值勾选及新增)
我们在开发中经常有此类应用: 一个字段存储以分隔符间隔的字符串.如",A,B,C,D,", 调号或分号是分隔符. 但在用户界面如何方便快捷的操作这组数据? 为了满足C/S框架快速开发的需求, 我编写了这个自定义控件,命名为CheckedListBoxEditor.

这个控件不仅支持复选还能输入一组新值.
ItemSeperator 属性: 定义一个分隔符,预设为","调号.
关键源码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors.Controls;
namespace CheckedListBoxEditor
{
/// <summary>
/// 支持输入的CheckedListBox控件.
/// </summary>
public partial class ucCheckedListBoxEditor : UserControl
{
private string _EditValue = "";
private string _Seperator = ",";
public ucCheckedListBoxEditor()
{
InitializeComponent();
this.Height = 22;
}
private void ucCheckedListBoxEditor_Load(object sender, EventArgs e)
{
popupEdit.Width = this.Width;
}
private void ucCheckedListBoxEditor_SizeChanged(object sender, EventArgs e)
{
popupEdit.Width = this.Width;
}
[DefaultValue(",")]
[Description("多个值中间的分隔符.如:AA,BB,CC")]
public string ItemSeperator
{
get { return _Seperator; }
set { _Seperator = value; }
}
[Description("返回列表中已勾选的值,以分隔符隔开")]
public string EditValue
{
get
{
_EditValue = this.GetItemCheckedValue();
return _EditValue;
}
set
{
_EditValue = value;
this.SetItemChecked(value);
}
}
/// <summary>
/// 绑定数据源(字符串)
/// </summary>
public void BindingDataSource(string[] items)
{
foreach (string item in items)
{
lists.Items.Add(item, item, CheckState.Unchecked, true);
}
}
/// <summary>
/// 绑定数据源
/// </summary>
/// <param name="dataSource">数据源</param>
/// <param name="valueMember">取值字段</param>
/// <param name="displayMember">显示字段</param>
public void BindingDataSource(DataTable dataSource, string valueMember, string displayMember)
{
foreach (DataRow row in dataSource.Rows)
{
lists.Items.Add(row[valueMember], row[displayMember].ToString(), CheckState.Unchecked, true);
}
}
//分解字符串
private void SetItemChecked(string value)
{
string[] items = value.Split(new string[] { _Seperator }, StringSplitOptions.None);
foreach (CheckedListBoxItem item in lists.Items)
{
foreach (string s in items)
{
if (s.ToLower() == item.Value.ToString().ToLower())
{
item.CheckState = CheckState.Checked;
break;
}
}
}
}
//获取字符串组合
private string GetItemCheckedValue()
{
string result = "";
foreach (CheckedListBoxItem item in lists.Items)
{
if (item.CheckState == CheckState.Checked)
{
result = result "," item.Value;
}
}
return result == "" ? "" : result _Seperator;
}
private EventHandler _OnCheckStateChanged = null;
/// <summary>
/// 勾选时触发的事件(可用户自定义)
/// </summary>
public event EventHandler OnCheckStateChanged
{
add { _OnCheckStateChanged = value; }
remove { _OnCheckStateChanged -= value; }
}
private void lists_SelectedValueChanged(object sender, EventArgs e)
{
if (_OnCheckStateChanged != null) _OnCheckStateChanged(lists, e);
}
/// <summary>
/// 勾选时触发的事件
/// </summary>
private void lists_ItemCheck(object sender, DevExpress.XtraEditors.Controls.ItemCheckEventArgs e)
{
this.popupEdit.EditValue = this.EditValue;
if (_OnCheckStateChanged != null) _OnCheckStateChanged(lists, e);
}
/// <summary>
/// 自动调整新增项输入框的宽度
/// </summary>
private void popupContainerControl1_SizeChanged(object sender, EventArgs e)
{
txtNewItem.Width = popupContainerControl1.Width - btnAdd.Width - 16;
}
/// <summary>
/// 新增项
/// </summary>
private void btnAdd_Click(object sender, EventArgs e)
{
if (txtNewItem.Text != string.Empty)
{
int index = lists.Items.Add(txtNewItem.Text, txtNewItem.Text, CheckState.Checked, true);
lists.SelectedIndex = index;
this.popupEdit.EditValue = this.EditValue;
txtNewItem.Text = "";
txtNewItem.Focus();
}
}
/// <summary>
/// 自定调整宽度
/// </summary>
private void popupEdit_QueryPopUp(object sender, CancelEventArgs e)
{
if (this.popupContainerControl1.Width < this.Width)
this.popupContainerControl1.Width = this.Width;
}
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors.Controls;
namespace CheckedListBoxEditor
{
/// <summary>
/// 支持输入的CheckedListBox控件.
/// </summary>
public partial class ucCheckedListBoxEditor : UserControl
{
private string _EditValue = "";
private string _Seperator = ",";
public ucCheckedListBoxEditor()
{
InitializeComponent();
this.Height = 22;
}
private void ucCheckedListBoxEditor_Load(object sender, EventArgs e)
{
popupEdit.Width = this.Width;
}
private void ucCheckedListBoxEditor_SizeChanged(object sender, EventArgs e)
{
popupEdit.Width = this.Width;
}
[DefaultValue(",")]
[Description("多个值中间的分隔符.如:AA,BB,CC")]
public string ItemSeperator
{
get { return _Seperator; }
set { _Seperator = value; }
}
[Description("返回列表中已勾选的值,以分隔符隔开")]
public string EditValue
{
get
{
_EditValue = this.GetItemCheckedValue();
return _EditValue;
}
set
{
_EditValue = value;
this.SetItemChecked(value);
}
}
/// <summary>
/// 绑定数据源(字符串)
/// </summary>
public void BindingDataSource(string[] items)
{
foreach (string item in items)
{
lists.Items.Add(item, item, CheckState.Unchecked, true);
}
}
/// <summary>
/// 绑定数据源
/// </summary>
/// <param name="dataSource">数据源</param>
/// <param name="valueMember">取值字段</param>
/// <param name="displayMember">显示字段</param>
public void BindingDataSource(DataTable dataSource, string valueMember, string displayMember)
{
foreach (DataRow row in dataSource.Rows)
{
lists.Items.Add(row[valueMember], row[displayMember].ToString(), CheckState.Unchecked, true);
}
}
//分解字符串
private void SetItemChecked(string value)
{
string[] items = value.Split(new string[] { _Seperator }, StringSplitOptions.None);
foreach (CheckedListBoxItem item in lists.Items)
{
foreach (string s in items)
{
if (s.ToLower() == item.Value.ToString().ToLower())
{
item.CheckState = CheckState.Checked;
break;
}
}
}
}
//获取字符串组合
private string GetItemCheckedValue()
{
string result = "";
foreach (CheckedListBoxItem item in lists.Items)
{
if (item.CheckState == CheckState.Checked)
{
result = result "," item.Value;
}
}
return result == "" ? "" : result _Seperator;
}
private EventHandler _OnCheckStateChanged = null;
/// <summary>
/// 勾选时触发的事件(可用户自定义)
/// </summary>
public event EventHandler OnCheckStateChanged
{
add { _OnCheckStateChanged = value; }
remove { _OnCheckStateChanged -= value; }
}
private void lists_SelectedValueChanged(object sender, EventArgs e)
{
if (_OnCheckStateChanged != null) _OnCheckStateChanged(lists, e);
}
/// <summary>
/// 勾选时触发的事件
/// </summary>
private void lists_ItemCheck(object sender, DevExpress.XtraEditors.Controls.ItemCheckEventArgs e)
{
this.popupEdit.EditValue = this.EditValue;
if (_OnCheckStateChanged != null) _OnCheckStateChanged(lists, e);
}
/// <summary>
/// 自动调整新增项输入框的宽度
/// </summary>
private void popupContainerControl1_SizeChanged(object sender, EventArgs e)
{
txtNewItem.Width = popupContainerControl1.Width - btnAdd.Width - 16;
}
/// <summary>
/// 新增项
/// </summary>
private void btnAdd_Click(object sender, EventArgs e)
{
if (txtNewItem.Text != string.Empty)
{
int index = lists.Items.Add(txtNewItem.Text, txtNewItem.Text, CheckState.Checked, true);
lists.SelectedIndex = index;
this.popupEdit.EditValue = this.EditValue;
txtNewItem.Text = "";
txtNewItem.Focus();
}
}
/// <summary>
/// 自定调整宽度
/// </summary>
private void popupEdit_QueryPopUp(object sender, CancelEventArgs e)
{
if (this.popupContainerControl1.Width < this.Width)
this.popupContainerControl1.Width = this.Width;
}
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
参考文档:
C#.Net用户自定义控件制作教程
C#.Net自定义控件设置图标ToolboxBitmap的用法
C#.Net自定义控件 - GridPopupContainerLookup
C#.Net自定义控件 - GridPopupContainerEdit
C#.NET百度地图定位API解决方案|C/S开发框架
百度地图API - 地址标注与位置显示(C#.NET)-C/S开发框架
C#.NET百度地图定位API解决方案
标签:C#.Net组件开发 - 属性窗体内显示自定义名称
C#.Net开发继承UITypeEditor接口的自定义属性编辑器
FastReport.NET自动文本宽度+自动换行+自动行高|C/S开发框架
FastReport.NET2023破解版去除水印DEMO VERSION (2025.1.14/2023.2.18版本)|C/S开发框架
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)|C/S开发框架
.NET C/S架构软件用户授权设计方案(mac地址+白名单用户)|C/S开发框架
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
.NETCore WebApi运行报错:System.AggregateException:“Some services are not able to be constructed|C/S开发框架
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
C#.Net用户自定义控件制作教程
C#.Net自定义控件设置图标ToolboxBitmap的用法
C#.Net自定义控件 - GridPopupContainerLookup
C#.Net自定义控件 - GridPopupContainerEdit
C#.NET百度地图定位API解决方案|C/S开发框架
百度地图API - 地址标注与位置显示(C#.NET)-C/S开发框架
C#.NET百度地图定位API解决方案
标签:C#.Net组件开发 - 属性窗体内显示自定义名称
C#.Net开发继承UITypeEditor接口的自定义属性编辑器
FastReport.NET自动文本宽度+自动换行+自动行高|C/S开发框架
FastReport.NET2023破解版去除水印DEMO VERSION (2025.1.14/2023.2.18版本)|C/S开发框架
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)|C/S开发框架
.NET C/S架构软件用户授权设计方案(mac地址+白名单用户)|C/S开发框架
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
.NETCore WebApi运行报错:System.AggregateException:“Some services are not able to be constructed|C/S开发框架
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
