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. luigi学习4-构建工作流

    luigi提供了两个基本单元来构造一个工作流,这两个基本单元分别是Task和Target.这两个单元都是抽象类,我们实现他们中的某些方法就可以了.除了这两个基本单元,还有一个重要的概念是Pramete ...

  2. Hbase负载均衡流程以及源码

    hmater负责把region均匀到各个region server .hmaster中有一个线程任务是专门处理负责均衡的,默认每隔5分钟执行一次. 每次负载均衡操作可以分为两步: 生成负载均衡计划表 ...

  3. PHP导出excel文件

    现在教教你如何导入excel文件: 在我的文件储存里面有一个com文件夹的,将其解压放在ThinkPHP/Library/文件夹里面,然后就是写控制器啦!去调用这个插件: <?php names ...

  4. 射击比赛 (POJ 1719) 题解

    [问题描述] 我们假设射击的目标是一个由R*C(2≤R≤C≤ 1000)个小方格组成的矩形网格.网格中每一列恰有2个白色的小方格和R-2个黑色的小方格.定义网格的行从顶至底编号为1~R,列从左至右编号 ...

  5. DMA直接内存存取20160525

    说一下工作中接触到的DMA1)在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题.即DMA传输前,CPU要把 总线控制权交给DMA控制器,而在结束DMA传输后,DMA ...

  6. 第十一章 管理类型(In .net4.5) 之 管理对象的生命周期

    1. 概述 本章内容包括 管理非托管资源.使用IDisposable接口 以及 管理析构器和垃圾回收. 2. 主要内容 2.1 理解垃圾回收机制 ① 代码执行的时候,内存中有两个地方存放数据项:堆 和 ...

  7. pure css做的pc登陆界面

    源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  8. python Django 学习笔记(三)—— 模版的使用

    模版基本介绍 模板是一个文本,用于分离文档的表现形式和内容. 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签). 模板通常用于产生HTML,但是Django的模板也能产生任何 ...

  9. python的内存管理

    1.在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用.当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象. a = 1 b = 1 print hex(i ...

  10. ExtJS MVC 学习手记3

    在演示应用中,我们已经创建好了viewport,并为之添加了一个菜单树.但也仅仅是这样,点击树或应用的其他地方获得不到任何响应.这个演示应用还是一个死的应用. 接下来,我们让这个应用活起来. 首先,给 ...