none
ASP.Net Ajax Updatepanel and Events RRS feed

  • Frage

  • Hallo,

    ich habe eine Frage bezüglich Updatepanels und Button Events die aus dem Updatepanel gefeuert werden sollen. Wenn ich das Scenario statisch aufbaue funktionieren alle Events aus dem UpdatePanel.

    Aber ich erzeuge es zur Laufzeit und daher scheint das Problem auch zu kommen.

    Mein code:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
            ImageButton testbtn = new ImageButton();
            UpdatePanel testUP = new UpdatePanel();
            testUP.ID = "up1";
    
    
            testbtn.Click += new System.Web.UI.ImageClickEventHandler(this.Button1_Click);
            ScriptManager1.RegisterAsyncPostBackControl(testbtn);
            Page.Form.Controls.Add(testbtn);
            Page.Form.Controls.Add(testUP);
            
    
        }
        protected void Button1_Click(object sender, ImageClickEventArgs e)
        {
            ImageButton test1 = new ImageButton();
    
            UpdatePanel testup = (UpdatePanel)FindControl("up1");
    
            PostBackTrigger pbTrigger = new PostBackTrigger();
            pbTrigger.ControlID = test1.UniqueID;
    
            testup.Triggers.Add(pbTrigger);
    
    
    
            test1.Click += new ImageClickEventHandler(this.ImageButton1_Click);
    
            ScriptManager1.RegisterAsyncPostBackControl(test1);
            testup.ContentTemplateContainer.Controls.Add(test1);
    
        }
        protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
    
        }
    }
    Das erste Event funktioniert Einwandfrei und Button1_Click wird ausgelöst. Das neu erstellte Event in Button1_Click das auf    

    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
    
        }
    verweisen soll wird nicht gefeuert. Warum nicht ? Mache ich da etwas falsch ?


    MFG

    Chris
    Montag, 7. September 2009 11:33

Antworten

  • Das Problem ist, dass die ControlTrees deiner Seite auf dem Client und Server unterschiedlich sind, weil du in dem nichtfunktionierenden Fall das Control erst nach der dafür vorgesehenen stage in die ControlCollection hinzufügst.

    Schau dir mal die Methode CreateChildControls an, diese steht auch in der richtigen LifeCycle Stage von ASP.Net, wenn die Controls dann verfügbar gemacht werden und in die ControlCollection geadded werden, sind Server und Client ControlTree gleich, dann funktionieren auch die events.

    Ich hoffe das hilft dir weiter

    Gruß Thorsten
    Es soll Fälle geben, in denen die Suche bereits die Antwort auf deine Frage weiß.
    Mittwoch, 9. September 2009 11:55
  • Hallo Chriz2009

    Du hast hier zwei Probleme.
    Nummer eins hat Thorsten schon angesprochen.
    Es muss zwischen dynamischen- und codeseitigen Controls unterschieden werden.
    Du hast hier beides in einem Topf. Erstens erzeugst du deine Controls per Code, also nicht statisch
    und zweitens erzeugst du den zweiten Button nicht deterministisch, das heisst nur wenn eine bestimmte Bedingung zutrifft wird
    das Control hinzugefügt oder eben nicht.

    Kurz und einfach:
    Codeseitig erstellte Controls müssen im OnInit zur ControlCollection hinzugefügt werden, brauchen eine einzigartige ID!, sowie der Event sollte zu diesem Zeitpunkt
    angemeldet werden.

    Dynamische Controls sind - sage ich mal - der heilige Gral von ASP.NET und daher überhaupt nicht simpel.
    Siehe dazu einfach mal hier weiter:

    - http://www.mycsharp.de/wbb2/thread.php?postid=3509816#post3509816

    Wieso es bei dir so nicht funktioniert kann ich dir allerdings sagen.
    Du erzeugst den zweiten Button sowie den Eventhandler erstens zu späte und zweitens nur wenn du den ersten Button geklickt hast,
    du müsstest also beide Buttons gleichzeitig Klicken, damit es funktionieren würde.

    Zudem hast du beim zweiten Button vergessen eine ID anzugeben, somit kennt ASP.NET den Button nach dem PostBack gar nicht mehr, bzw. die Werte die davon zurückkommen.


    Gruss Peter
    MVP - Visual Developer ASP / ASP.NET, Switzerland
    Mittwoch, 9. September 2009 14:35

Alle Antworten

  • Noch ein Update:

    Wenn ich die Controls in dem Page_Load event initialisiere und sie über testUP.ContentTeamplateContainer.Controls.Add(); hinzufüge, dann funkttioniert das event. Anders nicht. Warum ist das so ?

    Montag, 7. September 2009 12:25
  • Das Problem ist, dass die ControlTrees deiner Seite auf dem Client und Server unterschiedlich sind, weil du in dem nichtfunktionierenden Fall das Control erst nach der dafür vorgesehenen stage in die ControlCollection hinzufügst.

    Schau dir mal die Methode CreateChildControls an, diese steht auch in der richtigen LifeCycle Stage von ASP.Net, wenn die Controls dann verfügbar gemacht werden und in die ControlCollection geadded werden, sind Server und Client ControlTree gleich, dann funktionieren auch die events.

    Ich hoffe das hilft dir weiter

    Gruß Thorsten
    Es soll Fälle geben, in denen die Suche bereits die Antwort auf deine Frage weiß.
    Mittwoch, 9. September 2009 11:55
  • Hallo Chriz2009

    Du hast hier zwei Probleme.
    Nummer eins hat Thorsten schon angesprochen.
    Es muss zwischen dynamischen- und codeseitigen Controls unterschieden werden.
    Du hast hier beides in einem Topf. Erstens erzeugst du deine Controls per Code, also nicht statisch
    und zweitens erzeugst du den zweiten Button nicht deterministisch, das heisst nur wenn eine bestimmte Bedingung zutrifft wird
    das Control hinzugefügt oder eben nicht.

    Kurz und einfach:
    Codeseitig erstellte Controls müssen im OnInit zur ControlCollection hinzugefügt werden, brauchen eine einzigartige ID!, sowie der Event sollte zu diesem Zeitpunkt
    angemeldet werden.

    Dynamische Controls sind - sage ich mal - der heilige Gral von ASP.NET und daher überhaupt nicht simpel.
    Siehe dazu einfach mal hier weiter:

    - http://www.mycsharp.de/wbb2/thread.php?postid=3509816#post3509816

    Wieso es bei dir so nicht funktioniert kann ich dir allerdings sagen.
    Du erzeugst den zweiten Button sowie den Eventhandler erstens zu späte und zweitens nur wenn du den ersten Button geklickt hast,
    du müsstest also beide Buttons gleichzeitig Klicken, damit es funktionieren würde.

    Zudem hast du beim zweiten Button vergessen eine ID anzugeben, somit kennt ASP.NET den Button nach dem PostBack gar nicht mehr, bzw. die Werte die davon zurückkommen.


    Gruss Peter
    MVP - Visual Developer ASP / ASP.NET, Switzerland
    Mittwoch, 9. September 2009 14:35
  • Hallo Chriz2009,

    Haben Dir die Antworten geholfen?

    Grüße,
    Robert

    Donnerstag, 1. Oktober 2009 13:02
    Moderator
  • Hallo Chriz2009,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Montag, 5. Oktober 2009 11:55
    Moderator