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

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

            
return base.CanConvertFrom(context, sourceType);
        }


        
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        
{
            
if (destinationType == typeof(String)) return true;

            
if (destinationType == typeof(InstanceDescriptor)) return true;

            
return base.CanConvertTo(context, destinationType);
        }


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

            }


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

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


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


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

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


        
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        
{
            
return true;
        }


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

}

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

posted on 2006-12-15 21:49 纶巾客 阅读(5905) 评论(20) 编辑 收藏

评论

#1楼 2006-12-15 22:22 yunhuasheng      

好!!  回复 引用 查看   

#2楼 2006-12-15 22:50 Clingingboy      

顶一下  回复 引用 查看   

#3楼 2006-12-16 10:19 river[未注册用户]

頂一下!
這些都是寫Winform控件的基礎,你的這個系列不錯!
 回复 引用   

#4楼 2006-12-16 10:39 Slash      

搞winform控件?
好,支持了
最近也想学这个
以后常来
期待更多精彩
 回复 引用 查看   

#5楼 2006-12-16 10:53 netx[未注册用户]

好东西,顶啊  回复 引用   

#6楼[楼主] 2006-12-16 12:35 纶巾客      

谢谢大家的支持  回复 引用 查看   

#7楼 2007-09-02 17:09 逸云天[未注册用户]

非常不错,以前一直在寻找相关内容--为复杂属性的子属性提供编辑功能 。
非常感谢。
不过引用这个代码后,发现一个问题,就是编辑子属性后,必须要再点击下父属性,其值才会更改。
 回复 引用   

#8楼 2007-09-02 17:34 逸云天[未注册用户]

还有子属性上下顺序不知道怎么改变。希望能改变成
Socpe 20,10
min 20
max 10 。

 回复 引用   

#9楼 2007-10-13 14:12 snailsun[未注册用户]

实验中经常会发生“code generation for property "scope" failed Error was "Object reference not set to an instance of an object”.关闭重启vs后就没有这个问题,但是设好scope的属性比如说“12,133”,然后再修改一次,比如说“12,144”就会报上边所说得错误。后台的代码没有生成关于Scope类的代码。
不知道有哪位大虾知道怎么回事?????
 回复 引用   

#10楼 2009-03-13 16:04 David WenQuan[未注册用户]

@逸云天
在你Max和Min属前上面加上定制属性NotifyParentProperty(true)
即:
[NofifyParentProperty(true)]
public int Max
{
......
}
 回复 引用   

#11楼 2009-09-12 11:36 minide      

在msdn上
这么查找相关帮助啊
 回复 引用 查看   

#12楼 2009-11-28 09:44 鹤冲天      

重写GetPropertiesSupported、GetProperties,这次记住了  回复 引用 查看   

#13楼 2010-07-30 11:56 山明智      

是啊,楼主,7楼和8楼的问题我也遇到了,8楼的当然不是很棘手,7楼的问题,我们一块解决一下不吧。————.net人  回复 引用 查看   

#14楼 2010-12-02 09:53 .NET技术员      

啊啊啊啊啊 不行不行 看不到属性。还是跟原先的一样。跟没有增加一样 求解~~  回复 引用 查看   

#15楼 2011-05-04 11:39 Tiny.Wang      

不行啊,怎么我的看不到改变啊 ,和原来的,一样,求解~~~  回复 引用 查看   

#16楼 2011-05-04 11:41 Tiny.Wang      

现在看到了,在报了一次错之后可以看到属性了。很神奇~~  回复 引用 查看   

公告

本博客上的所有文章如非特别说明均为原创,如果要转载请注明文章出处。
昵称:纶巾客
园龄:6年3个月
粉丝:48
关注:0

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

统计

  • 随笔 - 48
  • 文章 - 0
  • 评论 - 384
  • 引用 - 116

搜索

 
 

常用链接

我的标签

随笔分类(44)

随笔档案(48)

文章分类

联系我

友情链接

积分与排名

  • 积分 - 265322
  • 排名 - 280

最新评论

阅读排行榜

评论排行榜

推荐排行榜