1、新建一个自定义Editor,继承自.NET自带的Editor,override某些方法,再附加到属性中:

public class MyCollectionEditor : CollectionEditor
{
public MyCollectionEditor(Type type) : base(type)
{
}
protected override void ShowHelp()
{
MessageBox.Show("别点了,点了也没用。");
}
}
[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]
public List<B> Bs2 { get; set; }

上图就在列表编辑框中重定义了点击“Help”时的操作。一般都是这么用的。

2、常见Editor

1)ArrayEditor,继承自CollectionEditor

2)BinaryEditor

3)CollectionEditor

4)DateTimeEditor

5)MultilineStringEditor

6)BitmapEditor,继承自ImageEditor

7)ColorEditor

8)ContentAlignmentEditor

9)CursorEditor

10)FontEditor

11)FontNameEditor

12)IconEditor

13)ImageEditor

14)MetafileEditor

15)UITypeEditor,所有这些的基类,他们能继承自它,我们怎么不行?

16)QueuePathEditor

17)DataControlReferenceCollectionEditor,继承自CollectionEditor

18)AppSettingsExpressionEditor,继承自ExpressionEditor

19)CollectionEditorBase,继承自CollectionEditor

20)ConnectionStringEditor

21)ConnectionStringsExpressionEditor,继承自ExpressionEditor

22)DataBindingCollectionEditor

23)ExpressionEditor

24)ExpressionCollectionEditor

25)ImageUrlEditor,继承自UrlEditor

26)MailFileEditor,继承自UrlEditor

27)MdbDataFileEditor,继承自UrlEditor

28)ResourceExpressionEditor,继承自ExpressionEditor

29)RouteUrlEditor,继承自ExpressionEditor

30)RouteValueExpressionEditor,继承自ExpressionEditor

31)ServiceReferenceCollectionEditor,继承自CollectionEditorBase

32)UpdatePanelTriggerCollectionEditor,继承自CollectionEditorBase

33)UrlEditor

34)UserControlFileEditor,继承自UrlEditor

35)AnchorEditor

36)BorderSidesEditor

37)DockEditor

38)FileNameEditor

39)FolderNameEditor

40)FormatStringEditor

41)ImageListImageEditor

42)ShortcutKeysEditor

43)BindingUIEditor

44)TypeBrowserEditor

还有部分Web命名空间下的没有记录,寻找方法,在对象浏览器中,搜索Editor,找出以Editor结尾,并继承自UITypeEditor的类即可。

3、可展开项的示例

[TypeConverter(typeof(ExpandableObjectConverter))]
public class B
{
public int Name1 { get; set; }
public int Name2 { get; set; }
public override string ToString()
{
return Name1 + "-" + Name2;
}
}
public class A
{
public A()
{
if (Bs == null)
{
Bs = new B();
}
}
public B Bs { get; set; }
}

4、下拉框的示例

public class XXXConverter : StringConverter
{
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(StringArray);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public static string[] StringArray = new[] { "AAA", "BBB" };
}
[TypeConverter(typeof(XXXConverter))]
public string Name2 { get; set; }

5、有效性验证示例

public class OneTo32Converter : Int32Converter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var result = (int)base.ConvertFrom(context, culture, value);
if (result < || result > )
{
throw new Exception("输入值要在1至32之间。");
}
return result;
}
}
[TypeConverter(typeof(OneTo32Converter))]
public int Name1 { get; set; }

6、数组自定义显示及去除展开对话框示例

public class XXXArrayConverter : ArrayConverter
{
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
return "sssss";
}
}
[TypeConverter(typeof(XXXArrayConverter)), Editor(typeof(UITypeEditor), typeof(UITypeEditor))]
public B[] Bs { get; set; }

7、Converter及Editor总结

如果附在uint类型的属性上,则:

Converter是用于该属性的类型uint与用于显示的类型string之间的转换;

ConvertFrom是string转换成uint;

ConvertTo是uint转换成string;

如果使用DateTimeEditor,则:

该Editor是用于uint与DateTime之间的转换;

而DateTimeEditor只会处理DateTime与DateTime之间的转换,所以要在EditValue方法中完成uint与DateTime的转换。

public class MyDateTimeEditor : DateTimeEditor
{
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
var result = (DateTime) base.EditValue(context, provider, new DateTime(, , ).AddSeconds((uint) value));
return (uint) ((result - new DateTime(, , )).TotalSeconds);
}
}
[TypeConverter(typeof(UInt32Converter)), Editor(typeof(MyDateTimeEditor), typeof(UITypeEditor))]
public uint C { get; set; }

Converter用于处理输入值时的行为,常用于有效性验证、格式转换等,而Editor用于处理下拉或打开新窗口时的行为。它们可以在同一个属性上共存。

8、自定义窗体示例

public class MyUITypeEditor : UITypeEditor
{
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
var picker = new Form1((uint) value);
if (picker.ShowDialog() == DialogResult.OK)
{
return picker.Seconds;
}
return value;
} public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
}

9、可编辑复合对象

public class A
{
public A()
{
if (EndPoint == null)
{
EndPoint = new PGIPEndPoint
{
IPAddress = "255.255.255.255",
Port =
};
}
}
[TypeConverter(typeof(IPEndPointConverter))]
public PGIPEndPoint EndPoint { get; set; }
}
public class IPEndPointConverter : ExpandableObjectConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return true;
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return true;
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var result = ((string)value).Split(':');
var ip = IPAddress.Parse(result[]);
var port = Convert.ToInt32(result[]);
if (port < || port > )
{
throw new Exception(string.Format("{0}要在0至65535之间。", port));
}
return new PGIPEndPoint
{
IPAddress = ip.ToString(),
Port = port
};
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
var result = (PGIPEndPoint)value;
return string.Format("{0}:{1}", result.IPAddress, result.Port);
}
}
public class PGIPEndPoint
{
[TypeConverter(typeof(IPConverter))]
public string IPAddress { get; set; }
[TypeConverter(typeof(ZeroTo65535Converter))]
public int Port { get; set; }
} public class ZeroTo65535Converter : Int32Converter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var result = Convert.ToInt32(value);
if (result < || result > )
{
throw new Exception(string.Format("{0}要在0至65535之间。", result));
}
return result;
}
} public class IPConverter : StringConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
return (IPAddress.Parse((string)value)).ToString();
}
}

10、属性的显示顺序

把PropertyGrid控件的PropertySort设置为NoSort可使属性以其被截取時的顺序显示。

11、去除工具栏

把ToolBarVisible设置为False。

C# Winform常见的Editor及其它经验的更多相关文章

  1. C# Winform常见的Editor

    常见Editor: 1)ArrayEditor,继承自CollectionEditor 2)BinaryEditor 3)CollectionEditor 4)DateTimeEditor 5)Mul ...

  2. 手工挖掘web常见漏洞时的一些经验总结

    一.前提: 漏洞挖掘原则 所有变量 所有头 cookie中的变量 逐个变量删除 漏洞的本质 数据与指令的混淆 对用户输入信息过滤不严判断失误,误将数据当指令 二.经典漏洞: 1.身份认证 常用弱口令/ ...

  3. FPGA editor 的使用之一 ------ Probe探针

    做FPGA设计经常会用到FPGA editor工具,今天开始总结下使用FPGA editor工具的经验. 1.添加probes 在debug时,经常要分析设计中的某一个信号的状态变化,需要观测这个信号 ...

  4. C# 如何在winform中嵌入Excel,内嵌Excel,word

    近使用.net做一个小软件遇到一个问题,就是想实现把excel表格在winform中打开,同时可以操作,不单单是打开.或者就提取数据.在网上找了好多资料,发现这方面的资料比较少,即使有,都是旧版本的使 ...

  5. 性能监控之常见 Java Heap Dump 方法

    一.前言 在本文中,我们总结下抓 Java dump 的几种不同方法. Java Heap Dump 是特定时刻 JVM 内存中所有对象的快照.它们对于解决内存泄漏问题和分析 Java 应用程序中的内 ...

  6. sql语句优化SQL Server

    MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了 ...

  7. 如何优化sql语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

  8. Atitit sql执行计划

    Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...

  9. 优化SQL查询:如何写出高性能SQL语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

随机推荐

  1. Mongodb添加地理位置索引

    1.同步站点信息到mongo中(支持mysql.sqlserver数据同步) 2.在Collections文件夹下所在文档右键,在菜单中选择Add Index, 3.然后进行数据查询{ "m ...

  2. c语言学习的第五天

    #include<stdio.h> #include<stdbool.h> int main() { _Bool num=1; if (num==true); { printf ...

  3. 配置NTP服务ntpd/ntp.conf(搭建Hadoop集群可参考)

    本文拟定是在一个局域网内(比如一个Hadoop集群)设定一台NTP服务器作为整个网络的标准时间参考,使用网络(集群)内的所有机器保持时间一致!以下是详细的操作步骤: 1. 修改选定的服务器的本地时间 ...

  4. nginx报file not found错误

    查看错误日志 [:q2013/10/20 18:41:40 [error] 27151#0: *106117 FastCGI sent in stderr: "Primary script ...

  5. 关于Raw,Assets的使用

    Raw,Assets下文件区别: 相同点:两个目录下的文件在打包后都会原封不动的保存到apk中,不会被编译成二进制. 不同点:Raw下文件不能使用目录结构, 有些格式的会被压缩,能够通过R.raw方便 ...

  6. 十天学会单片机Day0点亮LED (锁存器、三极管、继电器)

    C51常用的数据类型 数据类型 关键字 所占位数 表示数范围 无符号字符型 unsigned char 8 0~255 有符号字符型 char 8 -128~127 无符号整型 unsigned in ...

  7. 第六节:宿主如何使用AppDomain

    前面已经讨论了宿主以及宿主加载CLR的方式.同时还讨论了宿主如何告诉CLR创建和卸载AppDomain.为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形.特别地,我要解释不 ...

  8. ubuntu 14.04 下安装jdk8及 smartgithg

    公司使用git作为源码管理,又需要在ubuntu下工作,然后,自己就找了找,目前ubuntu下的git gui客户端,感觉 smartgit算是其中比较好用的一个,下边是具体安装步骤 说明,smart ...

  9. QPBOC扩展应用交易流程

    1 Q扩展部分数据 增加3个DGI,分别为:A001,8020,9020 9103中增加DF60(9F38中),DF61 增加DF62,DF63 1.1  A001扩展应用配置 DGI 长度 值(示例 ...

  10. ThinkPHP3.2.2中开启REWRITE模式

    1. 在项目配置文件(\Application\Common\Conf\config.php)中配置URL模式 <?php return array( //URL模式 , ); 2. 在Thin ...