[已解决问题] 重写TextBox控件 增加新属性的问题
提问时间: 2008-06-05 10:59
悬赏分:100 浏览:312 次

问题大概是这样。 我重写一个TextBox 控件 增加两个属性 。

屬性1
        [Bindable(true)]
        [Category("自定义信息区")]
        [Browsable(true)]
        [Description("綁定實例對象對象名")]
        [DefaultValue("")]
        public string BindEntityName
        {
            get {  }
            set {  }
        }
        [Bindable(true)]
        [Category("自定义信息区")]
        [Browsable(true)]
        [Description("綁定實例對象對象屬性名稱")]
        [DefaultValue("")]
屬性2    public string BindEntityPropertyName
        {
            get {  }
            set {  }
        }

具體的屬性的類型是否為string 在再議。現在如果我把一個重寫了的Textbox拖入頁面中的話。那么在它的Properties 視圖中 就會 多出兩個屬性一個是 BindEntityName 一個是 BindEntityPropertyName 。

假設有下面一個class

public class person
{
  public string Name
  {
    .....
  }
  public string Age
{
  ......
  }
}

當我在BindEntityName 輸入 “person” 以後 。BindEntityPropertyName 會自動綁定 Name Age 兩個item 提供用戶選擇。用戶可以選任意一個 賦給 BindEntityPropertyName 屬性。

目前思路比較亂,希望 大家提示一下

提问者:那一年 - 初学一级
最佳答案
你需要写一个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也可以使用类似的方法实现。我没有具体做过,你自己试一试吧。 :)
2008/6/5 14:42:30 回答者:Colin Han


提问者对于答案的评价:謝謝 Colin Han 的思路 代碼已經完成了 用的就是你的思路 謝謝
其它回答(3)
BindEntityName 是一个变量的名字,而不是一个类名;这样设计有问题呀,恐怕设计时的作用域作用不到局部变量。 这样的设计有意义吗?
3个月前   回答者:玉开 - 大侠五级
给自定义控件加属性 跟给用户控件加属性是一样的
3个月前   回答者:yeyang - 菜鸟二级
你的意思是在一个控件里面定义两个属性还是,定义一个person的属性,你很为难. 其实都可以,楼主可以看看这篇文章,看完以后相信对你有帮助 http://www.cnblogs.com/Clingingboy/archive/2006/08/08/470980.html
3个月前   回答者:Clingingboy - 菜鸟二级
评论
3个月前   那一年 :
先謝謝大家了
3个月前   那一年 :
BindEntityName 是一個 Textbox 新增的屬性名稱 不是一個變量名稱
3个月前   玉开 :
那BindEntityName 的值做什么用呀?
2个月前   那一年 :
第一步問題 解決了 謝謝大家的支持 我把 code 貼個大家
[Bindable(true)]
[Category("自定义信息区")]
[Browsable(true)]
[Description("綁定實例對象對象名")]
[DefaultValue("")]
public string BindEntityName
{
get { return ViewState["BindEntityName"] == null ? "" : (string)ViewState["BindEntityName"]; }
set { ViewState["BindEntityName"] = value; }
}

[Bindable(true)]
[Category("自定义信息区")]
[Browsable(true)]
[Description("綁定實例對象對象屬性名稱")]
[DefaultValue("")]
[TypeConverter(typeof(EntityConverter))]


public string BindEntityPropertyName
{
get
{
return ViewState["BindEntityPropertyName"] == null ? "" : (string)ViewState["BindEntityPropertyName"];
}
set { ViewState["BindEntityPropertyName"] = value; }

}

public class EntityConverter : TypeConverter
{
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{

List<string> values = new List<string>();
if (context != null)
{
CTCBTextBox control = context.Instance as CTCBTextBox;

if (control != null)
{
string className = control.BindEntityName;

if (className != "")
{
try

2个月前   THICK :
提供选择值是设计器的问题,楼上有正解
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关链接