2016-07-13 12 views
0

Ich versuche, einen Klick Ereignishandler für meine 4 Schaltflächen, die ich dynamisch generiert habe, ohne Code in Seiteninitialisierung oder oninit zu setzen. Ich habe einen Knopf, der einmal geklickt hat, erzeugt 4 weitere Knöpfe. Der Click-Ereignishandler für diese 4 Schaltflächen funktioniert nicht. Hier ist der Code. Hat jemand eine Möglichkeit gefunden, die Click-Ereignisse in asp.net C# zu verwenden, ohne es zuerst in page_load zu setzen? Wenn ich dieses Problem lösen kann, kann ich mein eigentliches Problem in einem größeren Szenario lösen .:Wie dynamische Klick Ereignishandler zu verwenden, ohne Seiteninit oder Seite laden

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

protected void Button1_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     Button b = new Button(); 
     b.ID = i.ToString(); 
     b.Text = "ClickMe"; 
     b.Visible = true; 
     b.Click += new EventHandler(b_click); 

     PlaceHolder1.Controls.Add(b); 
    } 
} 

void b_click(object sender,EventArgs e) 
{ 
    Label1.Text = "ok"; 
} 
+3

Der Grund dafür, dass der Event-Handler nicht funktioniert, ist, dass der Control-Tree beim Postback nicht korrekt neu erstellt wird. Es gibt ein spezielles Seitenereignis, das Sie überschreiben sollten, um die Schaltflächen vor dem Laden des Ansichtsstatus neu zu erstellen, damit das Ereignis ausgelöst wird. –

+1

Ist die Anzahl der Tasten statisch? Wenn Sie wissen, dass es nur vier Tasten gibt, verstecken Sie die Tasten einfach so lange, bis Sie sie brauchen. Auf diese Weise sollte Ihr Event-Kabel wie erwartet ohne zusätzliche Eingriffe funktionieren. – dstepan

+0

@ MattiasÅslund Ja, das ist die Init-Methode. Offensichtlich weiß der OP genau, was er tun muss, und doch sagt er ausdrücklich, dass er das nicht tun will. – Servy

Antwort

0

Sicherstellen, dass die ID Ihre dynamischen Kontrollen ein deutliches Schlüsselwort enthält. In meinem Beispiel unten habe ich "DYNAMIC_" ihrer ID vorangestellt. Dann überschreiben OnPreRender() wie folgt aus:

protected override void OnPreRender(EventArgs e) 
{ 
    if (Page.IsPostBack && !IsPostBackEventControlRegistered) 
    { 
     var controlName = this.Request.Form.AllKeys.SingleOrDefault(key => key.Contains("DYNAMIC_")); 
     processEventForDynamicControl(controlName); 
    } 

    base.OnPreRender(e); 
} 

private void processEventForDynamicControl(string controlName) 
{ 
    //Do your dynamic button click processing here 
} 

Natürlich, wenn Ihre dynamischen Steuerelemente verwenden doPost() (die leider Knopf nicht) können Sie die Steuerung direkt von __EVENTTARGET wie folgt abrufen:

var controlName = Request.Params.Get("__EVENTTARGET") 
0

Sie wollen Steuerelemente im Inneren laden Page_Load. Andernfalls befinden sie sich nicht im Kontrollbaum und können b_click Ereignis nicht auslösen.

public int Counter 
{ 
    get { return (int?) ViewState["Counter"] ?? 0; } 
    set { ViewState["Counter"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    var counter = Counter; 
    for (int i = 0; i < counter; i++) 
    { 
     Button b = new Button(); 
     b.ID = i.ToString(); 
     b.Text = "ClickMe"; 
     b.Visible = true; 
     b.Click += b_click; 
     PlaceHolder1.Controls.Add(b); 
    } 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Counter = 4; 
    for (int i = 0; i < 4; i++) 
    { 
     Button b = new Button(); 
     b.ID = i.ToString(); 
     b.Text = "ClickMe"; 
     b.Visible = true; 
     b.Click += b_click; 

     PlaceHolder1.Controls.Add(b); 
    } 
} 
void b_click(object sender, EventArgs e) 
{ 
    Label1.Text = "ok"; 
} 

Hinweis: Wenn Sie planen, innerhalb Page_Init zu laden, wollen Sie Session statt Viewstate verwenden.

+0

Ich würde mit diesem Ansatz gehen. Wenn Sie nicht mit Sitzungen vertraut sind, können Sie ein verstecktes Feld verwenden – user3532232

+0

*** Verstecktes Feld *** ist im Grunde dasselbe wie *** ViewState *** in diesem Szenario. Wenn Sie das ausgeblendete Feld verwenden, müssen Sie *** Page_Load *** verwenden, da sein Wert nicht innerhalb des *** Page_Init *** -Ereignisses verfügbar ist. – Win

0

Im Grunde habe ich es funktioniert. Es gibt keinen Weg um ihn herum. Sie müssen Oninit oder Page_load verwenden und den Code b.Click + = new EventHandler (b_click) zusätzlich zum PlaceHolder1.Controls.Add (b) einfügen. auch dort, damit sich der Event-Handler ordnungsgemäß mit dem Button registriert. Das Problem mit dieser Methode besteht darin, dass die Schaltfläche über den PlaceHolder-Teil der Webseite platziert wird, was nicht das ist, was ich möchte. Ich möchte den Knopf an einer bestimmten Stelle in der Webseite platzieren können. Also, wie gehst du rum? Grundsätzlich nach dem PlaceHolder1.Controls.Add (b) einfach die Schaltfläche unsichtbar machen. Dann, wenn Sie bereit sind, die Schaltfläche in einem bestimmten Teil Ihres HTML-Aufrufs PlaceHolder1.Controls.Add (b) erneut zu platzieren und sichtbar machen. Das ist für mich in Ordnung. Wenn jemand Hilfe mit diesem benötigt, kann ich etwas Beispielcode bekannt geben und Sie können es für selbst prüfen. Danke allen.

+0

Ist das nicht, was ich in [meine Antwort] (http://stackoverflow.com/a/38360247/296861) gesagt habe? Die Positionierung ist völlig außerhalb des Anwendungsbereichs Ihres OP. – Win