WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能-阿里云开发者社区

开发者社区> 嗯哼9925> 正文

WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能

简介:
+关注继续查看
      前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。因为属性只是“10200这种形式的,所以,你必须按照这种格式来修改,一旦格式错误就会引发异常,比如输入一个“10200。我们期望这个属性的每一子属性都能够被独立的编辑就好了,这并非不能实现,而且实现还很简单。
      为了在属性浏览器里能够独立的编辑子属性,我们还要重写两个方法:GetPropertiesSupported()和GetProperties();下面是ScopeConverter的完整代码:
   
None.gifpublic class ScopeConverter : TypeConverter
ExpandedBlockStart.gif    
{
InBlock.gif        
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if (sourceType == typeof(String)) return true;
InBlock.gif
InBlock.gif            
return base.CanConvertFrom(context, sourceType);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if (destinationType == typeof(String)) return true;
InBlock.gif
InBlock.gif            
if (destinationType == typeof(InstanceDescriptor)) return true;
InBlock.gif
InBlock.gif            
return base.CanConvertTo(context, destinationType);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
ExpandedSubBlockStart.gif        
{
InBlock.gif            String result 
= "";
InBlock.gif            
if (destinationType == typeof(String))
ExpandedSubBlockStart.gif            
{
InBlock.gif                Scope scope 
= (Scope)value;
InBlock.gif                result 
= scope.Min.ToString()+"," + scope.Max.ToString();
InBlock.gif                
return result;
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
if (destinationType == typeof(InstanceDescriptor))
ExpandedSubBlockStart.gif            
{
ExpandedSubBlockStart.gif                ConstructorInfo ci 
= typeof(Scope).GetConstructor(new Type[] {typeof(Int32),typeof(Int32) });
InBlock.gif                Scope scope 
= (Scope)value;
ExpandedSubBlockStart.gif                
return new InstanceDescriptor(ci, new object[] { scope.Min,scope.Max });
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return base.ConvertTo(context, culture, value, destinationType);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if (value is string)
ExpandedSubBlockStart.gif            
{
InBlock.gif                String[] v 
= ((String)value).Split(',');
InBlock.gif                
if (v.GetLength(0!= 2)
ExpandedSubBlockStart.gif                
{
InBlock.gif                    
throw new ArgumentException("Invalid parameter format");
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                Scope csf 
= new Scope();
InBlock.gif                csf.Min 
= Convert.ToInt32(v[0]);
InBlock.gif                csf.Max 
= Convert.ToInt32(v[1]);
InBlock.gif                
return csf;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return base.ConvertFrom(context, culture, value);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return true;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return TypeDescriptor.GetProperties(typeof(Scope), attributes);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif}

None.gif
      在GetProperties方法里,我用TypeDescriptor获得了Scope类的所有的属性描述器并返回。如果你对TypeDescriptor还不熟悉的话,可以参考MSDN
      重写这两个方法并编译以后,在测试工程里查看控件的属性,你可以看到Scope是如下的形式:
      






本文转自纶巾客博客园博客,原文链接:http://www.cnblogs.com/guanjinke/archive/2006/12/15/593784.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
金蝶BOS开发属性中规则事件
金蝶BOS开发属性中规则事件
16 0
AKM项目总结之PO FORM
AKM项目总结之PO FORM 作为AKM项目上的GAP之一,PO FORM GAP由我所在的DOMAIN来实现。今年春节后开工,我就开始设计PO FORM的功能,撰写功能说明书,一周后初步完成二个功能说明书。
763 0
MongoDB性能实践总结
MongoDB性能优化,有很多优化的方案,因自己曾参与过一段IoM 1.3的性能优化工作,这里只总结了一下我们实践过的性能要点,作为回顾。 一. MongoDB服务端性能优化点 1. 限制连接数 Mongod 的服务模型是每个网络连接由一个单独的线程来处理,每个线程配置了1MB 的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。另外,每个连接都要打开一个文件句柄,当然从成本上讲,这个消耗相对内存是小了很多。但换个角度,文件句柄也被其他模块消耗着,比如WT存储引擎,就需要消耗大量的文件句柄。 分布式shard集群部署环境的最大连接数通过route进程的
56 0
Winform 注册机通用软件注册功能之建立有效的软件保护机制
本文转载:http://www.cnblogs.com/umplatform/archive/2013/01/23/2873001.html  众所周知,一些共享软件往往提供给使用者的是一个功能不受限制的限时使用版,在试用期内使用者可以无限制的使用软件的全部功能(只是可能会出现提示使用者 注册的窗口),试用期一过部分(或全部)功能失效,要想继续使用只能向作者索取注册码(或注册文件)完成对软件的合法注册,注册后的软件将解除一切使用限 制。
719 0
Java性能优化之编程技巧总结
1、慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性能而言是非常糟糕的。
862 0
服务器性能配置要点总结
(1).操作系统 当前主流的服务器操作系统则主要分为:Windows server、UNIX、Linux、NetWare这四大阵容。不同的系统有不同的特点,要根据情况来判断Windows server是用户群体最大的服务器系统,不得不多做介绍。
1166 0
Android APP性能优化总结
​ 前述 最近在做app性能优化,这里做一个总结,供大家了解学习,也方便自己以后查阅. 用android的同学都知道,新买的手机用过一段时间后,手机变得越来越卡了;装了一些APP后,电量用得飞快,一天基本要一充;有些APP打开半天加载不出来;有些APP进入某些页面突然闪退;还有用了一些APP,流量...
1966 0
Android 开发中的代码片段(2)复制对象之间的属性值
前言 开发中会遇到这样的一个情况,我们得到一个dto对象,里面有几十个属性值,需要将这几十个属性值的N个通过VO传输另外一个地方,一般我们的做法是: 创建VO类,new vo() 对象,通过vo.set(dto.get)的方式不断的设置值。
862 0
+关注
4716
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载