2009-08-03 4 views
4

Wie referenziere ich Steuerelemente in C# (Laufzeit) ohne ID?C# Steuerelemente und Steuerreferenz finden

Zum Beispiel habe ich eine Seite mit einer Tabelle darin. Ich werde diese Seite mit xmlhttp rekursiv laden, so dass ich nicht auf die Tabelle verweisen kann, die ihre ID verwendet. Gibt es etwas in Bezug auf this.Page.Controls[2]? oder Controls["Tables"][0]?

Ich habe versucht, den Namen this.Controls.Find("MyTableName", true); müssen aber einen Verweis auf die Bibliothek mit System.Windows.Forms (glaube ich), aber nicht wissen, wie es fügen wie die 'using System.' intellisense es nicht sehen kann.

Ich durchschlug alle Kontrollen in this.Controls aber 'system.ui.web.control' does not contain a definition for '.Name', so dass ich nur nach ID suchen kann.

Ich bin neu und ich bin mir sicher, dass die Lösungen unglaublich einfach sind.
Vielen Dank im Voraus

+0

Ich glaube, ich verstehe nicht wirklich - auf welchen Teil der Seite Lebenszyklus werden Sie eine Anfrage Server-Seite für DOM, die Client-Seite geladen wird machen? –

+0

Der Datensatz wird in einem Baum angezeigt, der viel zu groß ist, um auf einmal geladen zu werden. Daher lade ich jeden Knoten im laufenden Betrieb, wenn der Benutzer ihn erweitert. – Praesagus

Antwort

12

Um ein Steuerelement auf Ihrer Seite zu finden, hat es eine Server-Kontrolle, wie folgt aus:

<asp:Table runat="server"> 
    ... 
</asp:Table> 

Regular HTML auf der Seite sind nicht „Kontrollen“, sind sie nur Text das wird an den Browser gesendet. Serversteuerelemente sind dagegen tatsächliche .NET-Klassen, die mit dem Codebehind interagieren können.

Sie können immer noch ein Handle für dieses Steuerelement ohne ID erhalten, indem Sie die Controls-Auflistung des Containers durchsuchen oder die Seite rekursiv durchsuchen. Beginnen wir mit der rekursiven Suche in der Controls-Auflistung:

Die Controls-Auflistung bezieht sich nur auf sofortige untergeordnete Steuerelemente eines bestimmten Steuerelements. Oder direkte untergeordnete Steuerelemente einer Seite. Jene Kontrollen der Reihe nach haben Kindkontrollen von ihren Selbst. Es repräsentiert einen Baum im Speicher.

ist hier ein Verfahren, den Baum von einem bestimmten Steuerelement rekursiv und die Kontrolle von ID zu finden:

private Control FindControlRecursive(Control control, string id) 
{ 
    Control returnControl = control.FindControl(id); 
    if (returnControl == null) 
    { 
     foreach (Control child in control.Controls) 
     { 
      returnControl = child.FindControlRecursive(id); 
      if (returnControl != null && returnControl.ID == id) 
      { 
       return returnControl; 
      } 
     } 
    } 
    return returnControl; 
} 

(über den Rahmen dieser Antwort, wird dies als extension method-besser gemacht).

Um eine Kontrolle durch etwas anderes als seine ID zu finden, können Sie nach Typ:

if(someControl is System.Web.UI.WebControls.Table) 

Beachten Sie, dass dies in der Regel nicht eine sehr gute Idee. Es ist kein großartiges Muster, wenn Sie auf diese Weise nach Steuerelementen suchen müssen - Sie sollten eine ID für Ihr Steuerelement haben, oder Sie sollten bereits einen Verweis darauf haben, weil es im Code erstellt wurde.

Allerdings ist es einfach, die Methode zu ändern rekursiv für einen Typ suchen:

private Control FindControl<T>(Control startFrom) 
{ 
    foreach(Control child in startFrom.Controls) 
    { 
     if(child.GetType().IsAssignableFrom(typeof(T))) 
     { 
      return child; 
     } 
     else 
     { 
      return FindControl<T>(child); 
     } 
    } 
    return null; 
} 

Sie nicht auf jeden Fall tun:

private Control FindTable(Control startFrom) 
{ 
    foreach(Control child in startFrom.Controls) 
    { 
     if(child is System.Web.UI.WebControls.Table) 
     { 
      return child; 
     } 
     else 
     { 
      return FindTable(child); 
     } 
    } 
    return null; 
} 

Sie auch eine generische Form dieses Verfahrens haben könnte Ich möchte System.Windows.Forms einbeziehen, da dies einfach den gesamten Code für eine WinForms-Anwendung enthält. Aus diesem Grund hat Visual Studio es in einem Webprojekt nicht für Sie bereitgestellt - Sie werden es nie brauchen. System.Web.UI hat alles für Web-Steuerelemente.

+0

Warum der Downvote? –

+0

Ich weiß nicht, warum der Downvote - saure Trauben von dem Kerl, der seine Antwort gelöscht hat? Also, wenn ich Ihre Idee verwenden, um nach Typ zu suchen, welche Art von Argument als meine generische Art definieren, so kann ich meine Methode auch andere Arten von Steuerelementen senden. if (myControl ist arg)? – Praesagus

+0

@Praesagus Ich habe Code zur Demo-Suche nach Typ anstelle von ID hinzugefügt. Ich würde diese Methode jedoch nicht empfehlen ... –

Verwandte Themen