我给一个自定义控件(继承自Button)新增了一个属性ButtonType(枚举类型,包括"新增","修改"等等),在设计时我改变ButtonType的值时让Text(继承自Button的属性)的值自动改变,比如我将ButtonType的值改成"新增",那么Text的值自动变成"新增",这一步已经实现了,问题是现在我手动将Text的值改成其它的值(任意值),然后运行,这也正常,然后再在设计时将ButtonType的值改成"修改",而运行后Text值还是刚才手工设置的值,不知道问题出在哪里?百思不得其解 ,希望大家帮助想想办法,万分感谢!
代码如下:
public class ButtonMX : System.Web.UI.WebControls.Button
{
public ButtonMX() : base()
{
}
private string _ButtonType;//仅仅为了说明问题,这里就不用枚举类型了
public string ButtonType
{
get
{
return _ButtonType;
} set
{
_ButtonType = value;
this.Text = value;
}
}
            }

解决方案 »

  1.   

    将ButtonMX拖到页面中,没写代码
      

  2.   

    override text property ,and when you read it, get the value from _ButtonType;
    like below:  public string ButtonType
    {
    get
    {
    return _ButtonType;
    } set
    {
    _ButtonType = value;

    }
    }        public String Text 
    {
    get 
    {
    return _ButtonType;
    }
    set 

    _ButtonType = value;
    }        
    }
      

  3.   

    Text属于是不能在设计时可以继承的~~~
      

  4.   

    smilnet(笨笨) :你的意思是说不能实现我的功能?
      

  5.   

    这大概是顺序先后的问题,试着override Render method:
    public class ButtonMX : System.Web.UI.WebControls.Button
    {.....protected override void Render(HtmlTextWriter writer)
    {
      if (_ButtonType != null && _ButtonType != String.Empty)
         this.Text = _ButtonType;  base.Render(writer);
    }
      

  6.   

    try: protected override void CreateChildControls()
    {
    base.CreateChildControls ();
    this.Text  = buttonType.ToString();
    }

    private SettingsType buttonType = SettingsType.新增;
    public SettingsType ButtonType
    {
    get{
    return buttonType;
    }
    set{
    buttonType = value;
    }
    }

    public enum SettingsType
    {
    修改,
    新增,
    查询
    }
      

  7.   

    saucer(思归/MVP) ,Seeko0(阿 枫) :你们的方法都不行,我也试着改动你们的代码,但都不能成功,麻烦你们帮我测试一下(测试很简单的),谢谢!
      

  8.   

    ButtonMX.cs:
    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;namespace MyControls
    { public enum SettingsType
    {
    不变=0,
    修改,
    新增,
    查询
    } /// <summary>
    /// Summary description for ButtonMX.
    /// </summary>
    [DefaultProperty("Text"), 
    ToolboxData("<{0}:ButtonMX runat=server></{0}:ButtonMX>")]
    public class ButtonMX : System.Web.UI.WebControls.Button
    {
    public ButtonMX() : base()
    {
    }
    private  SettingsType _ButtonType = SettingsType.不变;
    public  SettingsType ButtonType
    {
    get
    {
    return _ButtonType;
    } set
    {
    _ButtonType = value;
    this.Text = _ButtonType.ToString();
    }
    } protected override void Render(HtmlTextWriter writer)
    {
    if (_ButtonType != SettingsType.不变)
    this.Text = _ButtonType.ToString(); base.Render(writer);
    } }
    }WebForm.aspx:
    <%@ Register TagPrefix="cc1" Namespace="MyControls" Assembly="MyControls" %>
    <form id="WebForm5" method="post" runat="server">
    <cc1:ButtonMX id="ButtonMX1" style="Z-INDEX: 101; LEFT: 141px; POSITION: absolute; TOP: 89px" runat="server" ButtonType="修改" Text="修改fgdgfdgsgsfgsfgd"></cc1:ButtonMX>
    </form>
      

  9.   

    saucer(思归/MVP) :非常感谢您的回答
    但是,我希望Text的值可以通过手工更改,你的代码不能通过手工修改Text的值了我再说一下我的意思吧:通过改变ButtonType的值,Text自动变成ButtonType的值,Text的值也可以手动设置(也就是ButtonType中有一项是“自定义”),手动设置后,我再改变ButtonType的值后Text的值还是跟着变(除非选择的是“自定义”),这一切都是为了让控件在设计时更加方便。
    我的意思就是这样,但问题是,(我最初的代码)如果手工改了Text的值,再去更改ButtonType的值,Text的值就不会跟着变了(运行一下就看出来了)希望大家再帮我看看,这个问题对我来说非常重要。
    非常感谢所有关注的朋友。
      

  10.   

    该这里
    public  SettingsType ButtonType
    {
    get
    {
    return _ButtonType;
    } set
    {
    _ButtonType = value;
    if (_ButtonType != SettingsType.不变)
    this.Text = _ButtonType.ToString();
    }
    }
      

  11.   

    你最初的代码出问题是因为,一旦你自己在设计时设置了Text属性的值,此值就持久化在空间的标签里了,即便你在设计时更改ButtonType,Text属性变成ButtonType的值,但是你看Html代码标签内持久化的Text还是原来的,而你的控件在运行时,会解析标签内持久化的属性,从而覆盖你先前的Text.
      

  12.   

    moonewxp(母牛) :你解释的完全正确,但是你的代码还是不能解决问题
      

  13.   

    namespace WebControlLibrary
    {
    public enum SettingsType
    {
    自定义=0,
    修改,
    新增,
    查询
    } /// <summary>
    /// Summary description for ButtonMX.
    /// </summary>
    [DefaultProperty("Text"), 
    ToolboxData("<{0}:ButtonMX runat=server></{0}:ButtonMX>")]
    public class ButtonMX : System.Web.UI.WebControls.Button
    {
    public ButtonMX() : base()
    {
    }
    private  SettingsType _ButtonType = SettingsType.自定义;
    public  SettingsType ButtonType
    {
    get
    {
    return _ButtonType;
    } set
    {
    _ButtonType = value;
    if(_ButtonType != SettingsType.自定义)
    this.Text = _ButtonType.ToString();
    }
    }
    protected override void Render(HtmlTextWriter writer)
    {
    base.Render (writer);
    }
    }}
      

  14.   

    所以你还要向saucer(思归/MVP)那样重写Render方法
      

  15.   

    使用saucer的方法后,不能修改Text的值了!!!!!!
      

  16.   

    搂主我的意思,是你再blucecat得代码基础上改这里一段,这样当ButtonType是不变的时候,你就可以改变Text的值了
    public  SettingsType ButtonType
    {
    get
    {
    return _ButtonType;
    } set
    {
    _ButtonType = value;
    if (_ButtonType != SettingsType.不变)
    this.Text = _ButtonType.ToString();
    }
    }
      

  17.   

    可以修改TEXT的值的。
    this.ButtonMX1.ButtonType = csLig.SettingsType.不变;
      

  18.   

    可以修改TEXT的值的。
    this.ButtonMX1.ButtonType = MyControls.SettingsType.不变;