2011-11-18 89 views
0

我有一个自定义控件为表单生成标签输入对。我希望标签的文本由名称字段而不是ID字段控制。但是,当我进入自定义控件并明确设置标签的文本字段等于名称时,标签的文本始终是我的自定义控件的ID。为什么?页面上.text field for label not working

形式:

<FormUpgrade:FormUpgrade ID="fname" type="text" name="First Name" runat="server" /> 

在我oninit功能,我有台词:

aLabel.Text = name; 
this.Controls.Add(this.aLabel); 

aLabel之后是从来不碰。

但是,如果我手动键入我的标签字段,那么文本字段的行为如预期。

这里是整个定制控件的代码:

namespace FormUpgrade 
{ 
    [DefaultProperty("Text")] 
    [ToolboxData("<{0}:FormUpgrade runat=server></{0}:FormUpgrade>")] 
    public class FormUpgrade : WebControl 
    { 
     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("")] 
     [Localizable(true)] 

     public Label aLabel = new Label(); 
     public TextBox aField = new TextBox(); 
     public RegularExpressionValidator regexvalid = new RegularExpressionValidator(); 

     protected override void OnInit(EventArgs e) 
     { 
      regexvalid.ID = ID + "_validator"; 

      if (!String.IsNullOrEmpty(ID)) 
      { 
       aField.ID = ID+"_box"; 
       aLabel.ID = ID + "_label"; 
       aLabel.AssociatedControlID = aLabel.ID; 
      } 

      //aField.Attributes.Add("runat", "server"); 
      // aLabel.Attributes.Add("runat", "server"); 


      if (!String.IsNullOrEmpty(required)) 
      { 
       aField.Attributes.Add("required", required); 
       if (required.Equals("required")) 
       { 
        aLabel.Attributes.Add("class", "required"); 
       } 
      } 

      if (!String.IsNullOrEmpty(name)) 
      { 
       aField.Attributes.Add("name", name); 
       aLabel.Text = name; 
      } 
      else 
      { 
       aLabel.Text = ID; 
      } 

      if (!String.IsNullOrEmpty(placeholder)) 
      { 
       aField.Attributes.Add("placeholder", placeholder); 
      } 

      if (!String.IsNullOrEmpty(role)) 
      { 
       aField.Attributes.Add("role", role); 
      } 

      if (!String.IsNullOrEmpty(maxlength)) 
      { 
       aField.Attributes.Add("maxlength", maxlength); 
      } 

      if (!String.IsNullOrEmpty(placeholder)) 
      { 
       aField.Attributes.Add("placeholder", placeholder); 
      } 

      aLabel.Attributes.Add("for", ID+"_box"); 

      if (!String.IsNullOrEmpty(type)) 
      { 
       aField.Attributes.Add("type", type); 
      } 

      //if (type.Equals("date")) 
      //{ 
      // aField.Attributes.Add("class", "hasDatepicker"); 
      //} 

      if(type.Equals("textarea")) 
      { 
       aField.TextMode = TextBoxMode.MultiLine; 
      } 

      if (type.Equals("password")) 
      { 
       aField.TextMode = TextBoxMode.Password; 
      } 

      aLabel.Text = name; 

      this.Controls.Add(this.aLabel); 
      this.Controls.Add(this.aField); 

      if(type.Equals("email")) 
      { 
       regexvalid.ValidationExpression = "[a-zA-Z0-9]+([-+.][a-zA-Z0-9]+)*@[a-zA-Z0-9]+([-.][a-zA-Z0-9]+)*.[a-zA-Z0-9]+([-.][a-zA-Z0-9]+)*"; 
       regexvalid.ControlToValidate = ID+"_box"; 
       regexvalid.ErrorMessage = "Not a valid email address <br>"; 

       this.Controls.Add(regexvalid); 
      } 
      else if (type.Equals("url")) 
      { 
       regexvalid.ValidationExpression = "http(s)?://([a-zA-Z0-9-]+.)+[a-zA-Z0-9-]+(/[a-zA-Z0-9- ./?%&=]*)?"; 
       regexvalid.ControlToValidate = ID + "_box"; 
       regexvalid.ErrorMessage = "Not a valid URL<br>"; 

       this.Controls.Add(regexvalid); 
      } 
      else if(!String.IsNullOrEmpty(ValidationExpression)) 
      { 
        regexvalid.ControlToValidate = ID + "_box"; 
        regexvalid.ValidationExpression = ValidationExpression; 

        if (!String.IsNullOrEmpty(ValidationErrorMessage)) 
        { 
         regexvalid.ErrorMessage = ValidationErrorMessage + "<br>"; 
        } 

        this.Controls.Add(regexvalid); 
      } 

      base.OnInit(e); 
     } 

     public string Text 
     { 
      get 
      { 
       String s = (String)ViewState["Text"]; 
       return ((s == null) ? "[" + this.ID + "]" : s); 
      } 
      set 
      { 
       ViewState["Text"] = value; 
      } 
     } 

     public string type 
     { 
      get 
      { 
       String s = (String)ViewState["type"]; 
       return ((s == null) ? "[" + this.ID + "]" : s); 
      } 
      set 
      { 
       ViewState["type"] = value; 
      } 
     } 

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

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

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

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

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

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

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

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

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

     public override void RenderBeginTag(HtmlTextWriter writer) 
     { 
     } 

     public override void RenderEndTag(HtmlTextWriter writer) 
     { 
     } 

    } 
} 
+0

我之前并不了解官方接受功能。 – jsmith

+0

这是正确的常见问题:http://stackoverflow.com/faq#howtoask – CAbbott

回答

0

看起来这个问题可能是在这里:

public string Text 
{ 
    get 
    { 
     String s = (String)ViewState["Text"]; 
     return ((s == null) ? "[" + this.ID + "]" : s); 
    } 

    set 
    { 
     ViewState["Text"] = value; 
    } 
} 

我在想,s被返回null,而是返回ID 。如果Text为空,尝试只返回一个空字符串。

+0

我很困惑,唯一一次我叫文本是当我调用aLabel.Text,而不是fname.Text。 – jsmith

+0

也许我很困惑。那究竟是什么问题?在没有任何上下文的情况下将控件概念化非常困难,但是我认为这可能是因为您在ViewState重新加载之前将值设置为OnInit。你正在使用什么'Text'属性? –

+0

当您在Visual Studio中创建控件时,默认情况下会出现该文本属性。我没有用它做任何事情和我的oninit文件,我从来没有调用实例变量'文本'。我使用一个控件来创建一个标签,输入和正则表达式验证器。我想要自定义控件中的名称组件来确定标签显示的文本。不幸的是,标签显示的内容取决于ID变量而不是名称变量。 – jsmith