C# 让自己的类属性,能够提供动态改变数据的功能

例如,我们一般在设计WINDOWS应用程序时,TEXT控件的DataSource属性会根据拉到窗体设计器上的其它控件动态显示在PropertyGrid中.

看下图:(此图是一个给客户定制机器人运行的流程设计软件,图中的"容器"就是按下面的思路设计处理的)

在开发过程中,由于需要根据新添加的元件,在其他属性中显示连接的对象,就需要使用[动态下拉属性].

思路:设计一个类,然后该类提供数据,并在属性PropertyGrid中显示.
public class ClassA
{
 private static Form form;
 public static Form XForm
 {
  set{form=value;}
 }

 public class ChildA
 {
  private static string[] sArray;
  public static void RefreshOcx()
  {
   string sTmp = "";
   foreach(Control obj in form.Controls)
   {
    if(obj is PictureBox)
    {
     PictureBox pic = (PictureBox)obj;
     if(sTmp == string.Empty)sTmp = pic.Name;
     else sTmp = sTmp + "|" + pic.Name;
    }
   }
   sArray = sTmp.Split('|');
  }

  public static string[] OcxName
  {
   get{return sArray;}
  }
 }
}


//设计一个类,将它在PropertyGrid中显示
public class MyProps
{
 public MyProps(){}

 #region 所有图片控件
  public class UIPictureBoxName : StringConverter
  {
   public UIPictureBoxName(){}
   public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
   {
    return true;
   }

   public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
   {
    ClassA.ChildA.RefreshOcx(); //每次在点下拉框中刷新图片的名称
    string[] sName = ClassA.ChildA.OcxName;
    return new StandardValuesCollection(sName);
   }

   public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
   {
    return true;
   }
  }
 #endregion

 private string _PicBoxName;
 [CategoryAttribute("对象"),
 DefaultValueAttribute(""),
 ReadOnlyAttribute(false),
 TypeConverter(typeof(UIPictureBoxName)),
 Description("选择需要操作的连接图片名称")]
 public string 连接的图片
 {
  get{return _PicBoxName;}
  set{_PicBoxName=value;}
 }
}

//然后在FORM_LOAD中测试
ClassA.XForm = this;
this.propertyGrid.SelectedObject = new MyProps();

//如果用CODE动态添加一个图片到FORM上后,一定要加上ClassA.XForm = this;这样一来ClassA中的FORM就更新了.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值