2011-11-18 122 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