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条 ...
随机推荐
- event.preventDefault()
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- php判断是否为json格式的方法
php判断是否为json格式的方法. 首先要记住json_encode返回的是字符串, 而json_decode返回的是对象 判断数据不是JSON格式: 复制代码代码如下: function is_n ...
- apache日志文件详解和实用分析命令
apache日志文件每条数据的请意义,以及一些实用日志分析命令. 一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error ...
- PHP 定时任务|Cron
一. Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的执行.在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序.每个用户可以建立自己的调度cro ...
- MYSQL查询某字段中以逗号分隔的字符串的方法
首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...
- 共享内存 share pool (1):heap /extent /chunk/
相关概念 CHUNK: Shared pool物理层面上由许多内存块组成,这些内在块称为chunk.但是chunk是大小不一的,在内存中一个chunk是连续的. EXTENT:由多个连续的chunk组 ...
- jqueryMobile应用第一课《构建跨平台APP:jQuery Mobile移动应用实战》连载一(Hello World)
有人说每个程序员都曾经有过改变世界的梦想,笔者认为,这与程序员年轻时编写的第一个程序有着莫大的关系.简简单单的一句“hello world”让年轻的心开始相信梦想,用一种低调的壮志凌云向世界展示自己的 ...
- Factory Girl使用
1.使用Rspec,详见http://www.cnblogs.com/fanxiaopeng/p/3563772.html 2.在gemfile中添加 #Gemfile group :developm ...
- JSAPI_Ticket签名
1.微信 JS 接口签名校验工具 2.具体开发 2.1 获取access_token,然后jsapi_ticket /** * 获取access_token,然后jsapi_ticket */ pri ...
- 【HTML5】炫丽的时钟效果Canvas绘图与动画基础练习
源自慕课网 效果如下: 全部代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...