首页 新闻 赞助 找找看

重写TextBox控件 增加新属性的问题

0
悬赏园豆:100 [已解决问题] 解决于 2008-06-11 17:05
<P>问题大概是这样。 我重写一个TextBox 控件 增加两个属性 。</P> <P>屬性1 <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Bindable(true)] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Category("自定义信息区")] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Browsable(true)] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Description("綁定實例對象對象名")] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [DefaultValue("")] <BR>&nbsp; &nbsp; &nbsp; &nbsp; public string BindEntityName <BR>&nbsp; &nbsp; &nbsp; &nbsp; { <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get {&nbsp; } <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set {&nbsp; } <BR>&nbsp; &nbsp; &nbsp; &nbsp; } <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Bindable(true)] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Category("自定义信息区")] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Browsable(true)] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [Description("綁定實例對象對象屬性名稱")] <BR>&nbsp; &nbsp; &nbsp; &nbsp; [DefaultValue("")] <BR>屬性2&nbsp; &nbsp; public string BindEntityPropertyName <BR>&nbsp; &nbsp; &nbsp; &nbsp; { <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get {&nbsp; } <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set {&nbsp; } <BR>&nbsp; &nbsp; &nbsp; &nbsp; } <BR><BR>具體的屬性的類型是否為string 在再議。現在如果我把一個重寫了的Textbox拖入頁面中的話。那么在它的Properties 視圖中 就會 多出兩個屬性一個是 BindEntityName 一個是 BindEntityPropertyName 。 <BR><BR>假設有下面一個class <BR><BR>public class person <BR>{ <BR>&nbsp; public string Name <BR>&nbsp; { <BR>&nbsp; &nbsp; ..... <BR>&nbsp; } <BR>&nbsp; public string Age <BR>{ <BR>&nbsp; ...... <BR>&nbsp; } <BR>} <BR><BR>當我在BindEntityName 輸入 “person” 以後 。BindEntityPropertyName 會自動綁定 Name Age 兩個item 提供用戶選擇。用戶可以選任意一個 賦給 BindEntityPropertyName 屬性。</P> <P>目前思路比較亂,希望 大家提示一下</P>
那一年的主页 那一年 | 初学一级 | 园豆:70
提问于:2008-06-05 10:59
< >
分享
最佳答案
0
你需要写一个UITypeEditor。 1. BindEntityPropertyName属性添加EditorAttribute,如下: [Editor(typeof(BindEntityPropertyTypeEditor), typeof(UITypeEditor))] 2. 实现这个Editor从UITypeEditor继承 3. override GetEditStyle 方法,返回UITypeEditorEditStyle.DropDown 4. override EditValue方法,实现一个DropDownEditor。具体请参考MSDN中UITypeEditor中的例子。 5. 通过context参数中的Instance属性,你可以得到BindEntityPropertyName属性所在的类型实例。从它上面,你可以取到BindEntityName属性的值,通过反射可以取到你想要的属性。 我想,按照你的想法,这两个属性是字符串,可能各方面的复杂度都会低一些。另外,如果你希望在BindEntityName属性上也实现下拉列表框,可以参考上面的实现。如果你的列表框中的项目是固定的,建议你实现一个TypeConverter,实现起来更容易。如下: 1. 在BindEntityName上添加TypeConverterAttribute如下: [TypeConverter(typeof(BindEntityNameTypeConverter))] 2. override GetStandardValuesSupported 方法,返回True 3. override GetStandardValues方法,返回你给用户的备选项。 呵呵,刚才发现,TypeConverter上也可以拿到ITypeDescriptorContext。因此,BindEntityPropertyName也可以使用类似的方法实现。我没有具体做过,你自己试一试吧。 :)
Colin Han | 老鸟四级 |园豆:3041 | 2008-06-05 14:42
其他回答(3)
0
BindEntityName 是一个变量的名字,而不是一个类名;这样设计有问题呀,恐怕设计时的作用域作用不到局部变量。 这样的设计有意义吗?
玉开 | 园豆:8822 (大侠五级) | 2008-06-05 11:26
0
给自定义控件加属性 跟给用户控件加属性是一样的
yeyang | 园豆:418 (菜鸟二级) | 2008-06-05 13:02
0
你的意思是在一个控件里面定义两个属性还是,定义一个person的属性,你很为难. 其实都可以,楼主可以看看这篇文章,看完以后相信对你有帮助 http://www.cnblogs.com/Clingingboy/archive/2006/08/08/470980.html
Clingingboy | 园豆:215 (菜鸟二级) | 2008-06-05 15:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册