2010-12-14 12 views
0

ich eine ASP-Seite „A“ habe, und ich habe eine Benutzersteuerung „B“ erstelltSuche nach einer dynamisch hinzugefügt Steuerung auf einer aspx Seite

Wenn ich A.Controls.Add (B), würde Ich mag um ein Element zu machen, sagen wir eine TableRow, die im Steuerelement "B" definiert ist, unsichtbar über den Code dahinter.

Wenn ich durch Kontrollen von "A" schaue, kann ich nicht scheinen, diese Tabellenreihe zu finden.

Irgendwelche Hinweise?

Ich bin mir sicher, dass es etwas wirklich einfaches ist, das ich vermisse.

Vielen Dank.

Antwort

2

Sie sollten die Steuerelemente verfügbar machen, die von außen als Eigenschaften veränderbar und zugänglich sind. MSDN

Aber denken Sie daran, nicht die gesamte Kontrolle selbst zu exponieren, sondern nur f.e. eine Text-Eigenschaft einer Textbox, weil dadurch unbeabsichtigtes und unvorhersehbares Verhalten verhindert wird. Ein Benutzer-Steuerelement sollte Komplexität einkapseln und sollte (meistens) wiederverwendbar sein. Je mehr Kontrolle Sie den Steuerelementen (z. B. der Seite) bieten, die die Benutzersteuerung verwenden, desto weniger wiederverwendbar und um so fehlerhafter sind sie.

Wenn Sie zum Beispiel ein Login-Control mit einem Textfeld für den Benutzernamen und einem Textfeld für das Passwort erstellt haben, ist es sinnvoll, die Eigenschaften Benutzername und Passwort anstelle der Textboxen selbst anzugeben. Die Eigenschaften geben jeweils den entsprechenden Textbox-Text-Wert zurück.

In Ihrem Beispiel mit der TableRow, was ist ihr Zweck? Sie sollten eine Eigenschaft mit einem aussagekräftigen Namen angeben, um ihre Sichtbarkeit zu steuern (zB ShowTitle, wenn die Zeile einen Titel enthält, würde der Getter/Setter den sichtbaren Status der aktuellen Tabellenzeile zurückgeben/setzen).

Natürlich benötigen Sie einen Verweis auf Ihr Benutzersteuerelement, wenn Sie auf seine Eigenschaften zugreifen möchten. Sie sollten den Quellcode angeben, wenn Sie Probleme haben, ihn auf der Seite zu finden. Es hängt davon ab, wo Sie es erstellt und hinzugefügt haben. Normalerweise finden Sie Steuerelemente mit FindControl auf der NamingContainer (z. B. der NamingContainer eines Steuerelements, das in einer TemplateColumn von GridView definiert ist, ist die GridViewRow selbst).

1

können Sie die FindControl Methode von Seite verwenden, um ein bestimmtes Steuerelement durch seine ID zu finden, Ich bin mir nicht sicher, ob Sie das Benutzersteuerelement 'A', das Sie hinzugefügt haben, oder ein Steuerelement darin finden sollten Sie können die gleiche Methode verwenden, um das Steuerelement innerhalb zu finden, solange Sie die ID kennen. Wenn diese Tabellenzeile über das XML deklariert wurde, wird das Attribut runat = "server" festgelegt.

hoffe es hilft!

+0

Findcontrol nicht rekursiv ist. Sie müssten genau wissen, zu welchem ​​Container es hinzugefügt wurde. In einer dynamisch hinzugefügten Umgebung ist es möglich, dass das Steuerelement, nach dem er sucht, nicht einer ist, zu dessen Namen er den Namen zur Laufzeit kennt. –

1

Ich verwende gerne eine rekursive Erweiterungsmethode - funktioniert gut, unabhängig von Verschachtelung usw. Sie können es hacken, um ein Steuerelement mit einer bestimmten ID zurückzugeben.

Param Elternteil kann jede Kontrolle, einschließlich einer Webform oder einem Usercontrol :-)

//Recursively get all the Controls within parent 
    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control descendant in control.GetAllControls()) 
      { 
       yield return descendant; 
      } 
     } 
    }