2009-05-13 12 views
1

Ich habe eine verschachtelte UserControl (diese Steuerung dynamicall von einem anderen UserControl geladen wird, die dynamisch durch eine aspx Seite innerhalb eines Master geladen wird), in dem ich möchte verwenden, um eine LinkButton und die OnCommand Ereignis .Linkbutton in verschachtelten Usercontrols Zündbefehl Ereignis nicht

muss diese Schaltfläche zu einem gewissen Panel hinzugefügt werden, so hakte ich zum OnLoad Ereignisse des Panels (es erstellt werden muss, bevor Ereignisse im Lebenszyklus ausgelöst werden):

protected void PatentAssignee_Load(object sender, EventArgs e) { 
    Label label = (Label)sender; 

    LinkButton link = new LinkButton(); 
    link.Text = name; 
    link.Command += Link_OnCommand; 
    link.CommandArgument = "argument"; 
    link.ID = "someID"; 

    label.Controls.Add(link) 
} 

protected void Link_OnCommand(object sender, CommandEventArgs e) { 
    Response.Write(e.CommandArgument); 
} 

Aber ich kann‘ t Rufen Sie die Methode Link_OnCommand auf, die aufgerufen werden soll. Eine weitere Sache, die für dieses Problem relevant ist: Das UserControl befindet sich in einem UpdatePanel. Ich habe auch versucht die Verbindung, um eine vollständige Postbacks auslösen:

ScriptManager s = (ScriptManager)this.Page.Master.FindControl("__scriptManager"); 
s.RegisterPostBackControl(link); 

... aber es ändert sich nicht viel, wird die Seite komplett neu geladen, aber kein Ereignis ausgelöst wird.

EDIT: Wie in den Kommentaren aufgefordert, hier sind weitere Details über die Verschachtelung:

MasterPage 
    PlaceHolder 
    Page 
     UpdatePanel 
     UserControl1 
      FormView 
      PlaceHolder 
       UserControl2 
       LinkButton 

Das bedeutet, dass UserControl2 dynamisch geladen wird.

+0

Könnten Sie vielleicht etwas ausführlicher über die die dynamische Link-Button-Steuerelement enthalten enthält, und wo es auf der Seite + Master-Seite eingebettet ist. –

+0

Ich habe einige Details hinzugefügt ... Hoffe, das wird helfen, aber ich fühle mich wie das wird kompliziert;)! – Wookai

Antwort

0

Ich erinnere mich, dieses Problem auch zu haben. Ich habe das eigentliche Problem nicht gefunden, aber was ich getan habe, war, den Eventhandler in das aspx-Markup einzubinden, und es hat funktioniert.

Sie können auch versuchen, den Eventhandler in einer früheren Phase des Page Life Cycle einzubinden.

Probieren Sie den PreInit Eventhandler aus.

Weitere Informationen auf der Seite Lebenszyklus here.

+0

Sie meinen, den LinkButton im aspx statt auf der Serverseite zu erstellen? Wie könnte ich das dynamisch machen, dh mit CommandArgument abhängig von einigen Daten? – Wookai

+0

Es tut mir leid, mein Schade :) Ich dachte, du würdest den Eventhandler nur dynamisch hinzufügen. Ich denke, dass das dynamische Erstellen von Steuerelementen früher im Lebenszyklus erfolgen sollte. – user31571

+0

Ich habe auch versucht, es während der Init ... Aber ich denke, das Problem ist woanders, als ich auch versuchte, einen LinkButton manuell auf meiner Seite hinzuzufügen, und das Ereignis wurde auch nicht ausgelöst! – Wookai

2

Einer Ihrer Steuerelemente in der Hierarchie fehlt eine ID. Legen Sie die ID fest und das Ereignis wird ausgelöst. Dies verursacht auch Chaos mit dem AjaxControlToolkit (stellen Sie sicher, dass jeder Extender eine ID hat oder das Verhalten der Client-Seite oft nicht geladen wird).

0

für die Ajax, ich glaube, Sie eine wiederverwendbare Klasse erstellen können

public void registerUCAsyncPostBack(Page page, WebControl webcontrol, UserControl usercontrol){ 
      Control ControlAjaxNew = null; 
      if (webcontrol.GetType() == typeof(LinkButton)) 
      { 
       ControlAjaxNew = (LinkButton)usercontrol.FindControl(webcontrol.ID); 
      } 
      ScriptManager.GetCurrent(page).RegisterAsyncPostBackControl(ControlAjaxNew); 
     }