C# Winform常见的Editor及其它经验
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及其它经验的更多相关文章
- C# Winform常见的Editor
常见Editor: 1)ArrayEditor,继承自CollectionEditor 2)BinaryEditor 3)CollectionEditor 4)DateTimeEditor 5)Mul ...
- 手工挖掘web常见漏洞时的一些经验总结
一.前提: 漏洞挖掘原则 所有变量 所有头 cookie中的变量 逐个变量删除 漏洞的本质 数据与指令的混淆 对用户输入信息过滤不严判断失误,误将数据当指令 二.经典漏洞: 1.身份认证 常用弱口令/ ...
- FPGA editor 的使用之一 ------ Probe探针
做FPGA设计经常会用到FPGA editor工具,今天开始总结下使用FPGA editor工具的经验. 1.添加probes 在debug时,经常要分析设计中的某一个信号的状态变化,需要观测这个信号 ...
- C# 如何在winform中嵌入Excel,内嵌Excel,word
近使用.net做一个小软件遇到一个问题,就是想实现把excel表格在winform中打开,同时可以操作,不单单是打开.或者就提取数据.在网上找了好多资料,发现这方面的资料比较少,即使有,都是旧版本的使 ...
- 性能监控之常见 Java Heap Dump 方法
一.前言 在本文中,我们总结下抓 Java dump 的几种不同方法. Java Heap Dump 是特定时刻 JVM 内存中所有对象的快照.它们对于解决内存泄漏问题和分析 Java 应用程序中的内 ...
- sql语句优化SQL Server
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- 如何优化sql语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
- Atitit sql执行计划
Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...
- 优化SQL查询:如何写出高性能SQL语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
随机推荐
- varnish状态引擎2
如何让varnish支持虚拟主机: if (req.http.host = "www.nihao.com") { } 强制对某资源的请求,不检查缓存: 上图表示以/test1.ht ...
- 集群session的一致性
一. 何为session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分配一个唯一的会话标识(sessio ...
- 【深入比较ThreadLocal模式与synchronized关键字】
[深入比较ThreadLocal模式与synchronized关键字]ThreadLocal模式与synchronized关键字都是用于处理多线程并发访问变量的问题.只是两者处理问题的角度和思路不同. ...
- 了解Unix进程(1)
今天瞎看 看到一本了解Unix进程 -- 理解UNIX进程 的书 不错,可以看看,使用的ruby语言,第一章讲的是一些基础的知识 1.输出进程号和父进程号: puts Process.pid # 得到 ...
- windows下编译lua源码
所有的lua源码都放在了 src 文件夹下,当然,不同的lua版本目录结构有可能不一样,但是都会有 src 这个文件夹,只有这个才是我们编译必须的.而且lua越做越精简了,5.1的版本里面还有一些te ...
- mysql开启全文索引功能
注意:全文检索模块需要mysql开启全文索引功能,开启方法:修改mysql配置文件:window服务器为my.ini,linux服务器为my.cnf,在 [mysqld] 后面加入一行“ft_min_ ...
- Mysql 简单问题汇总(持续更新)
主从架构相关问题 问题现象:从机连接主机时报错 [ERROR] Slave I/O: error connecting to master 'repl@192.168.0.50:3306' - ret ...
- 最大子列和CT 01-复杂度2 Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- 2.html5的基本格式
分享完html语言的核心之后,是时候开始写了.理论上,只要符合格式要求,就算是用记事本也可以写.但是,这种蛋疼且生产力低下的行为还是少做的好,选一个适合自己的IDE才是上上之选,至于哪个合适自己,那就 ...
- WPF中线性渐变画刷的一个小窍门
最近被项目里面控件的设计搞的死去活来的,大部分的设计都会需要使用进度条的功能,因为UI形状的变态,使用ProgressBar不能满足需求,没办法就自己想办法实现进度显示.折腾的多了发现一个很不错的方法 ...