例如,我们一般在设计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就更新了.