快速业务通道

ASP.net控件开发系列之五

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21

TypeConverter

在本系列的上篇文章中,和大家控讨了控件开发与propertyGrid的关系,不知现在大家现在对propertygrid有没有一个较全面的了解,也不知大家有没有做个工程,把propertyGrid拉进去鼓捣鼓捣?

“另起炉灶”

现在我们来思考一个问题:假于,propertygrid没有把属性和事件分成两个分页来显示,会产生什么效果?

那还用说,太乱了。

那如果你设计的控件有很多的属性,而一些关联性很强,或都是操作一个方面的,那么我们可以把它们分门别类,摆到一起,怎么做呢?

我们可以给这个控件类指定以下Attribute:

[PropertyTab(typeof(YourPropertyTab), PropertyTabScope.Component)]
public class YourControlClass
{
}

其中,前面一个参数指定处理PropertyTab的类,后一个参数说明要应用在什么时候,Component为当前组件专用,Document当前文档专用,Global只能由父给件显式去除,Static不能去除。

internal class YourPropertyTab : PropertyTab
{
  internal YourControlType target;
   public override string TabName
  {
  get
  {
   return "选项卡的名字";
  }
  }
  public override Bitmap Bitmap
  {
  get
  {
   return new Bitmap(base.Bitmap, new Size(16,16));//这里是使用保存为嵌入资源的和YourPropertyTab类同名的.bmp文件
  }
  }
  public override bool CanExtend(object o)
  {
  return o is YourControlType;//什么时候用这个Tab
  }
      public override PropertyDescriptorCollection GetProperties(object component, Attribute[] attrs) {
        return GetProperties(null, component, attrs);
     }
  /**//// 主要的逻辑. 在这里定义如何实现分Tab显示
  public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object component, Attribute[] attrs)
  {
  YourControlType uc = component as YourControlType;
  if (uc == null)
  {
   //以下代码实现不是YourControlType时,使用本身类型的逻辑。
   TypeConverter tc = TypeDescriptor.GetConverter(component);
   if (tc != null)
   {
   return tc.GetProperties(context, component, attrs);
   }
   else
   {
   return TypeDescriptor.GetProperties(component, attrs);
   }
  }
  target = uc;
  ArrayList propList = new ArrayList();
  //..建立一个属性List
  propList.Add(new YourPropertyDescriptor(this);
  PropertyDescriptor[] props = (PropertyDescriptor[])propList.ToArray(typeof(PropertyDescriptor));
  return new PropertyDescriptorCollection(props);
  }
  //我们还要建立自定义的PropertyDescriptor供GetProperties方法使用。
  private class YourPropertyDescriptor : PropertyDescriptor
  {
  YourPropertyTab owner;
  public NumPointsPropertyDescriptor(YourPropertyTab owner) ://注意这里的参数
   base("PropertyName", new Attribute[]{CategoryAttribute.Data, RefreshPropertiesAttribute.All})//第二个参数是指定属性改变时,与     //其它属性的联动,整个属性页是否刷新,All-刷新,Default-不,Repaint-重画属性窗口
  {
   this.owner = owner;
  }
  public override Type PropertyType//属性的类型 
  {
   get
   {
   return typeof(int);
   }
  }
  属性关联对象是什么类型
  public override Type ComponentType
  {
   get
   {
   return typeof(YourControlType);
  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号