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

简介:
      前面的几篇文章中,我们给控件添加一个复杂的类型 Scope ,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。因为属性只是“ 10 200 这种形式的,所以,你必须按照这种格式来修改,一旦格式错误就会引发异常,比如输入一个“ 10200 。我们期望这个属性的每一子属性都能够被独立的编辑就好了,这并非不能实现,而且实现还很简单。
       为了在属性浏览器里能够独立的编辑子属性,我们还要重写两个方法: GetPropertiesSupported ()和 GetProperties ();下面是 ScopeConverter 的完整代码:
   
None.gif public   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,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
36 0
|
9月前
|
JavaScript
fastadmin表格列表内部自定义按钮
fastadmin表格列表内部自定义按钮
161 0
fastadmin表格列表内部自定义按钮
|
9月前
|
UED 开发者
构建可访问的自定义表单控件
在现代Web应用程序中,表单是一个至关重要的组件。用户可以通过表单输入数据并与应用程序进行交互。为了提高用户体验,并让所有用户都能轻松地使用您的应用程序,构建可访问的自定义表单控件是非常重要的。
|
11月前
|
设计模式 JSON 前端开发
如何设计一个属性面板?
如何设计一个属性面板?
131 0
|
C#
WPF整理-为控件添加自定义附加属性
原文:WPF整理-为控件添加自定义附加属性 附加属性,大家都不陌生,最常见的是Canvas.Left/Canvas.Top,类似的也有Grid.Row/Grid.Column等附加属性。举个最常见的例子 需要说明的是并不是所有的附加属性都是元素放进去后才会有附加效果,上面的例子只是刚好是这种错觉的巧合情况,Grid.Row也属于这种巧合。
2041 0
|
Web App开发
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能
前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。
666 0
|
SQL
【实现】表单控件里的子控件的变化。
     前情回顾: 【实现】表单控件的UI布局,实现方式         上一篇说的是表单布局上的变化,也就是通过TR、TD的设置,实现了多行多列的效果。那么格子画好了,我们 可以往里面放控件了。
858 0
|
C#
wpf 依赖属性和附加属性
原文:wpf 依赖属性和附加属性 1、依赖属性   解释:依赖属性是配合binding出现的产物,功能主要是配合binding。   作用:     一、当自定义usercontrol时,需要与宿主(父窗体)双向绑定值时,用到依赖属性。
1908 0
|
C# 前端开发
WPF Adorner+附加属性 实现控件友好提示
原文:WPF Adorner+附加属性 实现控件友好提示 标题太空泛,直接上图   无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成。
949 0
|
C# 数据安全/隐私保护
WPF 使用附加属性增加控件属性
原文:WPF 使用附加属性增加控件属性 使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活   一、自定义附加属性 1 2 3 4 5 6 7 8 9 10 11 ...
851 0