2008-11-21 15 views
9

Ich habe dieses Problem mit dynamisch erstellten TextBox.Event-Handler für dynamisch erstellte Steuerelemente nicht ausgelöst

Wenn die TextBox in PageLoad erstellt wird, wurde ihr TextChanged-Ereignis ausgelöst.
Aber wenn ich die TextBox dynamisch löschte und neu erstellte, wurde der TextChanged nicht ausgelöst.

Dies ist der Code:

ASPX-Datei

<body> 
    <form id="form1" runat="server"> 
    <div> 

    <asp:Table ID="Table1" runat="server"> 
     <asp:TableRow> 
     <asp:TableCell ColumnSpan="2">Fixed content</asp:TableCell> 
     </asp:TableRow> 
    </asp:Table> 
    </form> 
</body> 

CS-Datei

public partial class test : System.Web.UI.Page 
{ 
    string myText = "a"; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    WriteRows(); 
    } 

    private void WriteRows() 
    { 
    TableRow tr = new TableRow(); 

    TableCell tc = new TableCell(); 
    TextBox txt = new TextBox(); 
    txt.Text = myText; 
    txt.TextChanged += new EventHandler(txt_TextChanged); // Assign event handler 
    tc.Controls.Add(txt); 
    tr.Controls.Add(tc); 

    tc = new TableCell(); 
    tc.Text = txt.Text; 
    tr.Controls.Add(tc); 

    Table1.Controls.AddAt(1, tr); 
    } 

    private void txt_TextChanged(object sender, EventArgs e) 
    { 
    myText = ((TextBox)sender).Text; 
    RedrawTable(); // Delete the row (incl. the TextBox) and rewrite it 
    } 

    private void RedrawTable() 
    { 
    Table1.Controls.RemoveAt(1); 
    WriteRows(); 
    } 
} 

Hat jemand eine Lösung haben, so dass das Ereignis immer ausgelöst wird?

+0

Haben Sie Ihr Problem gelöst? Ich habe das gleiche Problem mit dynamisch erstellten ASP-Taste. Ich setze ID auf die Schaltfläche, dies führt jedoch zu keinem Ergebnis. – Nurlan

Antwort

11

Ereignisbehandlung durch ASP.NET durch Abgleichen Steuerung des ID & die Anforderungsparameter durchgeführt wird. In Ihrem Fall hat die TextBox, die während txtTextChanged() erstellt wurde, eine automatische ID, weil Sie keine explizite ID angeben. Diese ID wird während des Ereignisses Textänderung zurückgesendet.

Nach dem Seitenladeereignis versucht ASP.NET, ein Steuerelement mit einer solchen ID zu finden, um das Ereignis dafür auszulösen. Offensichtlich wird ASP.NET nicht in der Lage sein, die Übereinstimmung zu finden, da die TextBox, die während Page_Load() erstellt wurde, anders ist und eine andere ID hätte.

Um dies zu lösen: eine explizite ID für Ihre Textbox angeben:

TextBox txt = new TextBox(); 
txt.Text = myText; 
txt.ID = "txtBox"; 
+0

+1 Ich glaube, das ist der einzige Unterschied zwischen meinen dynamisch erstellten Steuerelementen und den in diesem Code angegebenen snippit. Ich mache so etwas: 'txt.ID = String.Format (" txtUserId_ {0} ", id)' –

+0

@BryanRehbein M auch die ID auch zuweisen, aber das Ereignis noch nicht feuert, m auf .net 2.0 Framework – 1Mayur

+0

Ich habe das gleiche Problem mit dynamisch erstellten ASP-Taste. Ich setze ID auf die Schaltfläche, dies führt jedoch zu keinem Ergebnis. – Nurlan

1

Ich hatte ein ähnliches Problem. Ich denke, das Problem ist, dass dynamisch erstellte Steuerelemente nicht im Ansichtszustand gehalten werden und ein Postback nicht überleben. Hier ist ein Kommentar von meinem Code, der die Lösung beschreibt, die ich mir ausgedacht habe (es ist vielleicht nicht die einzige, aber es hat für mich funktioniert).

Diese Seite wird verwendet, um ein Raster dynamisch zu definieren. Der Benutzer klickt die Kontrollkästchen , um anzugeben, welche Felder in das Raster aufgenommen werden sollen. Die Logik dieser Seite tut zwei wesentliche Dinge:

(1) Es verwaltet das GridDefinition-Objekt, das in ViewState beibehalten wird. (2) Es rekonstruiert die programmatisch hinzugefügten Steuerelemente (im Wesentlichen alles im Tabellenobjekt) von der GridDefinition in ViewState bei jedem Postback. Die dynamisch hinzugefügten Steuerelemente werden auf dem Postback von ViewState NICHT neu erstellt. In der Tat habe ich festgestellt, dass ihre Ereignisse nicht ausgelöst werden, wenn Sie die Steuerelemente nicht neu erstellen. Anscheinend:

 "The process that matches controls to posted values occurs 
     after page_load completes, so it has to occur just like this 
     if you are to use this way." 

Wenn ich eine Steuer Ereignis, das angibt einige Änderungen an den Daten bekommen, ich habe widerzuspiegeln, die in dem Objekt in Gridviewstate gespeichert ändern. Auf diese Weise kann das Steuerelement auf dem NEXT Postback ordnungsgemäß neu erstellt werden (z. B. ein Textfeld, das den Header-Text für eine Rasterspalte angibt).

0

Als ich dieses Thema recherchierte, war es im Zusammenhang mit dynamischen Menüs, und es gibt eine Reihe von Google-Antworten, die mich zusammengebracht haben (weil es eine häufig genug Anforderung ist, schätze ich) Ich habe keine Zusammenfassung der Antwort, aber es könnte ein hilfreicher Ausgangspunkt sein (zB google für Dynamic Menus .NET). Auch hier auf dieser Seite gibt es einige Fragen.

0

... wie ein anderer Vorschlag, nicht Ereignisse nach Page_Load zu spät binden? und deshalb werden sie nicht auf den Postback gefeuert. vielleicht etwas überprüfen ..

+0

In meinem asp.net-Code kann ich Ereignisse an dynamisch erstellte Steuerelemente den ganzen Weg durch Page_Load binden, Page_LoadComplete ist zu spät und gebundene Ereignisse werden nicht ausgelöst. –

2

für ein Postback-Ereignis ausgelöst, das Steuerelement, das das Ereignis mit der gleichen ID vorhanden sein muss und die gleichen Daten auf dem Postback-Lebenszyklus ausgelöst werden soll.

Wenn statische Steuerelemente (definiert in Ihrem aspx/ascx/master) und viewstate aktiviert sind, werden sie automatisch neu erstellt.

Wenn Sie nicht Ansichtszustand verwenden möchten, oder dynamische Steuerelemente verwenden, benötigen Sie Steuerelemente Databind auf jeder page_load, so dass die Kontrollen und läuft in der Zeit für Ereignisse ausgelöst zu (geschieht nach Page_Load)

Wenn Sie die ID eines übergeordneten Steuerelements oder einer übergeordneten Seite ändern, können Sie versehentlich den ViewState-Autobind abwerfen, da die Steuerelement-IDs die IDs der Vorgänger enthalten. Ich denke, Sie sollten das sicher tun, solange Sie es in Page_Init tun (bevor Viewstate eingerichtet ist)

0

Ich bin noch einmal daran erinnert, warum ich asp vermeiden - mir scheint es wie eine Ebene der Abstraktion zu viele . Aber ist es in Analogie zu JavaScript möglich, dass Sie mehr als einen Handler für das Event haben?

3

Versuchen die Steuerelemente im Page_Init() Methode ... und

2

neu erstellen dynamisch erstellte Steuerelemente in Page_Init. Sie haben keinen Zugriff auf die Viewstate-Daten eines Steuerelements, wenn Sie es in Page_Load neu erstellen (ViewState wird in PreLoad geladen, was vor Page_Load geschieht).

Vergessen Sie auch nicht, dem Steuerelement eine ID zuzuweisen.

0

Ihre Antwort unten mit gesamtem Code gegeben:

string myText = "a"; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    WriteRows(); 
} 

private void WriteRows() 
{ 
    TableRow tr = new TableRow(); 

    TableCell tc = new TableCell(); 
    TextBox txt = new TextBox(); 
    txt.Text = myText; 

    txt.ID = "txt1"; 

    txt.TextChanged += new EventHandler(txt_TextChanged); // Assign event handler 

    txt.AutoPostBack = true; 

    tc.Controls.Add(txt); 
    tr.Controls.Add(tc); 

    tc = new TableCell(); 
    tc.Text = txt.Text; 
    tr.Controls.Add(tc); 

    Table1.Controls.AddAt(0,tr); 

} 

private void txt_TextChanged(object sender, EventArgs e) 
{ 
    myText = ((TextBox)sender).Text; 
    RedrawTable(); // Delete the row (incl. the TextBox) and rewrite it 
} 

private void RedrawTable() 
{ 
    Table1.Controls.RemoveAt(0); 
    WriteRows(); 
} 
0

Sie werden erforderlich sein, um nur eine ID-Eigenschaft mit dem Textbox zuweisen. Es sollte dein Problem lösen.

0

Ich hatte das gleiche Problem, und in meinem Fall txt.AutoPostBack = true war was ich verpasst habe. Standard ist falsch, leicht zu vergessen.

Verwandte Themen