2015-03-31 91 views
0

我正在動態添加一些用戶控件,它們有一個文本框。當文本框中的文本發生更改時,我正在嘗試激發一個事件。TextChanged事件在動態添加用戶控件中的文本框沒有觸發

我的代碼是這樣:

的Default.aspx:

<asp:Panel ID="pnlControls" runat="server"/> 

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyControl control = (MyControl)LoadControl("Controls/MyControl.ascx"); 
    control.NameField = "Test Name"; 
    pnlControls.Controls.Add(control); 
} 

MyControl.ascx

<asp:TextBox ID="txtNameField" runat="server" OnTextChanged="txtNameField_TextChanged" AutoPostBack="true"/> 

MyControl.ascx.cs

public string NameField; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostback) 
    { 
     txtNameField.Text = NameField; 
    } 
} 

protected void txtNameField_TextChanged(object sender, EventArgs e) 
{ 
    NameField = txtNameField.Text; 
} 

這是代碼的簡化版本,其中包含所需要的所有相關零件,使功能工作的要求(據我所知)

但是,txtNameField_TextChanged函數永遠不會執行。如何在txtNameField文本更改時執行該功能?

+0

你的意思是NameField沒有價值,如果你改變文本? – tharif 2015-03-31 09:30:51

+0

不,我的意思是'txtNameField_TextChanged'函數永遠不會被調用。 – PTuckley 2015-03-31 09:31:26

回答

3

嘗試分配IDUserControl

MyControl control = (MyControl)LoadControl("Controls/MyControl.ascx"); 
control.ID = "MyUserControl"; 
control.NameField = "Test Name"; 
pnlControls.Controls.Add(control); 

控件必須在回發同一個ID可以觸發事件或加載其視圖狀態。

另外,您不需要將txtNameField.Text分配給事件中的字段。只需使用獲取/設置txtNameField.Text的屬性即可。然後,您始終擁有正確的價值,並且自動保留在回傳中。

因此,不是這樣的:

public string NameField; 

protected void txtNameField_TextChanged(object sender, EventArgs e) 
{ 
    NameField = txtNameField.Text; 
} 

此:

public string NameField 
{ 
    get 
    { 
     return txtNameField.Text; 
    } 
    // maybe you want to make it public 
    private set 
    { 
     txtNameField.Text = value; 
    } 
} 
+0

應該工作 – mmg666 2015-03-31 10:04:08

0

您需要將txtNameField添加到您的textChanged-Event中。

MyControl:

this.TextChanged += new EventHandler(txtNameField_TextChanged); 

至少我認爲那是你正在嘗試做的,因爲我看不到這行代碼中的任何地方。

+0

如何以編程方式綁定事件處理程序將有所幫助? OP已經聲明性地綁定它'OnTextChanged =「txtNameField_TextChanged」' – 2015-03-31 09:43:00

+0

哦對,我沒有看到。 nvm然後 – Smogen 2015-04-02 08:01:31

0

我的猜測是,你的點擊事件的綁定丟失了。請嘗試在Page_Load之前動態添加控件,最好的地方是在Page_Init之內,其他控件也在初始化。 (此時頁面中的所有其他控件實際已初始化)

請檢查ASP.NET Page Life Cycle Overview哪裏明確指出應在預初始階段添加動態控件。並且here是您正在使用的LoadControl方法的鏈接,其中該代碼示例中的init階段還動態添加了控件。

0

你能試着&測試與附加的調試。

我複製你的代碼&執行,對我來說「OnTextChanged」事件正在觸發。 即使我已將文本框放置在用戶控件中,我正在進行profprmatically加載。

相關問題