2011-02-28 23 views
0

我想創建一些自定義Web控件包裝一些現有的控件。例如,其中一個是文本框的包裝(因爲我需要其他行爲,如相應的驗證器)。問題是,我不知道如何獲取該回放的數據。自定義WebControl和回發

非常簡單的例子:

public class MyTestBox: WebControl 
{ 
protected TB { get; set; } 
public Text 
{ 
    get { return TB.Text; } 
    set { TB.Text = value; } 
} 
protected override void CreateChildControls() 
{ 
TB= new TextBox() 
Controls.Add(TB); 
} 
} 

但如果我現在和控制測試Web窗體:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
<bleh:MyTextBox ID="MyTextBox1" runat="server" /> 
<asp:Button ID="Button1" runat="server" Text="Submit" /> 

然後輸入文本到文本框,並提交後,在TextBox1中的文本可在Page_Load中,而MyTextBox1.Text爲空。發送回傳時,我應該更改哪些內容可用?

編輯:

東西我覺得現在是初始化控制時,只需檢查申請表:

protected override void OnInit(EventArgs e) 
{ 
    TB.ID = this.ID + "_TextBox1"; 
    Controls.Add(TB); 
    if (Page.Request.Form[TB.UniqueID] != null) 
    { 
     Text = Page.Request.Form[TB.UniqueID]; 
    } 
} 

這似乎是工作,但感覺有點哈克。這看起來是一種合理的方式嗎?

+0

它是從System.Web.UI.Textbox繼承的選項嗎?如果是這樣,你不會在意文本屬性,你將專注於你想添加的任何功能。 – adt 2011-03-02 09:03:24

+0

在這種情況下,這是一個選項,我可能會這樣做。 另一方面,也有一些更復雜的控件有類似的問題,它有更多的問題,並且可能更好地堅持我在編輯中添加的方式。 – Kuzco 2011-03-02 09:35:42

回答

0

您應該爲動態生成的TextBox提供一個ID,然後在控件的Text屬性中找到TextBox並返回其Text。

public class BksTextBox: WebControl 
{ 
protected TB { get; set; } 
public Text 
{ 
    get 
    { 
     return ((TextBox)this.FindControl("txt")).Text; 
    } 
} 
protected override void CreateChildControls() 
{ 
TB= new TextBox() 
TB.ID = "txt"; 
Controls.Add(TB); 
} 
} 
+0

恐怕似乎沒有工作。 – Kuzco 2011-02-28 10:52:45

0

我沒有得到你的問題。 如果您需要在Web控件中添加一些額外的行爲,您應該做同樣的事情,您希望擴展繼承的類行爲。 可以繼承straigh形式的文本框類,並添加所有的額外行爲需要

public class BksTextBox: TextBox 
    { 
    //it is just as example 
    public string TextToUpperCase 
    { 
    get 
     { 
     return Text.ToUpperCase(); 
     } 
    } 

} 
+0

但是,如何將它連接到實際的文本框,當用戶更改文本並提交時,ViewState [「Text」]被更新? – Kuzco 2011-02-28 10:46:01

+0

這仍然沒有辦法,因爲在用戶輸入文本然後提交的過程中,Text屬性的集合不被訪問,因此ViewStart條目爲空。 – Kuzco 2011-03-02 09:30:29

0

它可能有一些做的頁面生命週期。嘗試在Text屬性獲取器中使用this.EnsureChildControls()。有關頁面生命週期的更多信息,請參見MSDN documentation

相關問題