ASP.NET - Hinzufügen von Ereignishandler zum LinkButton innerhalb von Repeater in einem RenderContent-Aufruf


4

Ich habe ein Sharepoint WebPart, das ein benutzerdefiniertes Benutzersteuerelement lädt. Das Benutzersteuerelement enthält einen Repeater, der wiederum mehrere LinkButtons enthält.

Im RenderContent Aufruf im Webpart ich einen Code haben Event-Handler hinzuzufügen:

 ArrayList nextPages = new ArrayList(); 
     //populate nextPages .... 
     AfterPageRepeater.DataSource = nextPages; 
     AfterPageRepeater.DataBind(); 

     foreach (Control oRepeaterControl in AfterPageRepeater.Controls) 
     { 
      if (oRepeaterControl is RepeaterItem) 
      { 
       if (oRepeaterControl.HasControls()) 
       { 
        foreach (Control oControl in oRepeaterControl.Controls) 
        { 
         if (oControl is LinkButton) 
         { 
          ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click); 
         } 
        } 
       } 
      } 
     } 

Die Funktion PageNavigateButton_Click wird jedoch nie genannt. Ich kann jedoch sehen, dass es im Debugger als Event-Handler hinzugefügt wird.

Irgendwelche Ideen? Ich bin ratlos, wie das geht.

  0

Ich habe nach der Lektüre der Vorschläge der Leute etwas mit dem Code herumgemacht. Ich versuche, die Ereignishandler jetzt in der Funktion CreateChildControls() hinzuzufügen, aber sie werden immer noch nicht ausgelöst. Danke für die Hilfe bis jetzt, es ist geschätzt 24 sep. 082008-09-24 15:49:16

+1

Für diejenigen, die dies spät im Spiel sehen. Verwenden Sie nicht CreateChildControls ... Das ist noch zu spät im Zyklus. Überschreiben Sie stattdessen den OnInit-Handler, um alle Ihre dynamischen Steuerelemente zu erstellen. 03 sep. 092009-09-03 01:51:45

6

Bis zum Aufruf von RenderContent() wurden alle registrierten Event-Handler vom Framework aufgerufen. Sie müssen die Event-Handler in einem früheren Verfahren, wie OnLoad() hinzufügen:

protected override void OnLoad(EventArge e) 
{ base.OnLoad(e); 
    EnsureChildControls(); 

    var linkButtons = from c in AfterPageRepeater.Controls 
               .OfType<RepeaterItem>() 
        where c.HasControls() 
        select c into ris 
         from lb in ris.OfType<LinkButton>() 
         select lb; 

    foreach(var linkButton in linkButtons) 
    { linkButton.Click += PageNavigateButton_Click 
    }       
} 
  0

Ich habe es versucht Setzen des Codes, der die Ereignisbehandlungsroutinen in der CreateChildControls() -Methode hinzufügt, um jetzt zu verwenden. Vielen Dank 24 sep. 082008-09-24 15:46:32


1

Sie müssen sicherstellen, dass der Link-Button erneut in den Steuerungsbaum eingefügt wird und/oder dass das Ereignis bis zum Steuerelement neu verkabelt wird, bevor das Ereignis ausgelöst wird.

Article @ 4guysfromrolla


1

habe ich noch nie eine Sharepoint-WebPart getan, damit ich weiß nicht, ob dies gilt. Aber wenn es eine einfache alte apsx-Seite wäre, würde ich sagen, dass es zu dem Zeitpunkt, zu dem es gerendert wird, zu spät ist. Versuchen Sie, die Ereignishandler in den Init- oder PreInit-Ereignissen des Steuerelements hinzuzufügen.


Edit: Warten Sie, ich denke, Dilli-O richtig sein könnte. Siehe Hinzufügen von Tastensteuerungen zu einem Repeater Abschnitt am Ende http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html. Es ist in VB.NET, aber Sie können das gleiche in C# leicht tun.


2

Haben Sie versucht, die Eigenschaften CommandName und CommandArgument während der Iteration den einzelnen Schaltflächen zuzuweisen? Das Repeater-Steuerelement unterstützt das ItemCommand-Ereignis, das ein Ereignis ausgelöst wird, wenn ein Steuerelement mit der CommandName-Eigenschaft erreicht wird.

Von dort ist es einfach genug zu verarbeiten, da die Werte CommandName und CommandArgument in das Ereignis übergeben werden und leicht zugänglich sind.

  0

Gordon, check out: http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html 23 sep. 082008-09-23 18:48:45

  0

Ich habe das versucht, aber die Ereignisse werden immer noch nicht gefeuert 24 sep. 082008-09-24 15:47:38


1

Wie andere haben darauf hingewiesen, die Sie hinzufügen die Ereignishandler zu spät im Lebenszyklus Seite. Für SharePoint-WebParts sollten Sie normalerweise die OnInit/CreateChildControls-Methoden der Klasse überschreiben, um die Aktivität zu behandeln.


1

Sie Ihr webpart müssen die INamingContainer Marker Schnittstelle zu implementieren, ist es durch den Rahmen verwendet wird, Postbacks zu ermöglichen, auf die richtige Steuerung zurückzukehren ... auch die Bedienelemente in Ihrem webpart müssen alle eine ID haben.