C#.Net开发继承UITypeEditor接口的自定义属性编辑器
开发一个项目必然有很多选择功能,比如选择一个货品类型或某种类别,需要在界面上显示名称(Display Name)而数据库存储编号(ID)。我用过Delphi开发工具里面有第三方控件支持,而.Net本身没有适合这个功能的组件。DevExpress有个LookUpEdit,虽然支持此功能,但有个缺点:LookUpEdit控件必须绑定Properties.DataSouce,指定一个数据源,还要设置DisplayMember和ValueMember。DataSource可以是ObjectList或者DataTable,必须先准备这个数据源,比如创建一个对象数组或者下载一个DataTable,只要绑定好DataSource就可以用了。
我们可以把DataSource 看作为一个数据字典(基础数据),如果绑定DataTable,意味着数据库必须要有这张表,或者自己New一个DataTable也行,当然从视图取数也是可行的。
如果有一种情况:数据源只有ID,DisplayName两个属性,用以上方式处理是不是有点杀鸡焉用牛刀?是不是人为复杂化了?所以,我着手开发一个基于在属性编辑框内定义数据源的自定义控件,取名ucValueEditor,这个控件继承LookUpEdit。
如下图:
拖一个ucValueEditor,按F4显示属性窗体。
点Items属性右侧的[...]按钮打开属性编辑器(Value Editor),在表格内输入Value,DisplayName数据,定义好后点OK按钮。
注:Items属性类型是一个带有特殊符号的String,用于初始化这个二维表格,在设计时会本地化Items的数据,再次打开时会解析成一张二维表。
运行程序,再看LookUpEdit控件绑定的数据源:
关键代码:
PropertyEditor 类,自定义属性编辑器需要继承UITypeEditor基类。
/// <summary>
/// 自定义属性编辑器
/// </summary>
public class PropertyEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
//指定为模式窗体属性编辑器类型
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
//打开属性编辑器修改数据
return frmValueEditor.EditValue(value);
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
Items属性定义。
/// <summary>
/// 带符号的字符串
/// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Editor(typeof(PropertyEditor), typeof(UITypeEditor))]
[Localizable(true)]
[Category("Appearance")]
[Description("自定义数据列表")]
public object Items
{
get { return _Items; }
set
{
_Items = value;
ValueToTable(value);
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
指定自定义类型的属性编辑器:
[Editor(typeof(PropertyEditor), typeof(UITypeEditor))]
扫一扫加作者微信
Source Code: