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条 ...
随机推荐
- linux 常用命令及技巧
linux 常用命令及技巧 linux 常用命令及技巧:linux 常用命令总结: 一. 通用命令: 1. date :print or set the system date and time 2. ...
- [译]MongoDB 3.0发布说明
原文来自:http://docs.mongodb.org/manual/release-notes/3.0/ 2015年3月3日 MongoDB 3.0现已可供使用.关键新特性包括支持WiredTig ...
- 解决:JS如何取得当前正在执行的function的名字
代码如下 function getFName(fn){ return (/^[\s\(]*function(?:\s+([\w$_][\w\d$_]*))?\(/).exec(fn.toString( ...
- php验证是否是md5编码的代码
php验证是否是md5编码的示例. 代码很简单,使用了正则表达式. function is_md5($password) { return preg_match("/^[a-z0-9 ...
- WordPress 主题开发 - (六) 创建主题函数 待翻译
We’ve got a file structure in place, now let’s start adding things to them! First, we’re going to ad ...
- (转)最强Android模拟器genymotion的安装与配置
Android开发人员都知道,原生的模拟器启动比较慢,操作起来也不流畅,还会出现莫名的问题.当然很多人都会选择直接使用android手机来开发,但是有时候需要在投影仪上演示程序的时候手机不太好做到吧. ...
- Linux获取用户主目录
#!/usr/bin/python# -*- coding:utf-8 -*-import sysimport osclass get_home_path(object): def __init__( ...
- python杂记-3(购买商品)
#!/usr/bin/env python# -*- coding: utf-8 -*-#如下是一个购物程序:#先输入工资,显示商品列表,购买,quit退出,最后格式化输出所买的商品.count = ...
- C# WPF使用ZXing生成二维码ImageSource
介绍: 如果需要实在WPF窗体程序中现类似如下的二维码图片生成功能,可以通过本文的方法实现 添加步骤: 1.在http://zxingnet.codeplex.com/站点上下载ZXing .Net的 ...
- Node.js中的模块化
每天一篇文章来记录记录自己的成长吧.大二,该静心了.加油~ 好了,废话不多说,今天说说nodejs中的模块化.(注:此文为自己对书nodejs实战的总结) nodejs一个重要的特性就是模块化,模块就 ...