2010-09-10 11 views
5

Gibt es eine Möglichkeit, die vorherigen und nächsten gleichgeordneten Steuerelemente in einem ASP.net-Formular aus code-behind zu finden, ähnlich wie findControl()?Ermitteln der vorherigen und nächsten gleichgeordneten Steuerelemente

Manchmal möchten Sie einem Steuerelement keine ID zuweisen, nur damit Sie ein parent(). FindControl ("ID") verwenden können, um es zu finden. Ich bin es müde, mit IDs zu kommen, wenn alles, was ich tun könnte, ist previousControl() oder etwas (a la jQuery).

Dies wäre auch nützlich in Situationen, in denen Sie eine allgemeine Funktion schreiben, um mehrere Steuerelemente mit einem ähnlichen Layout anzusprechen und diese nicht einzeln anzugehen.

Vielen Dank für Anregungen.

Antwort

6

Für die Nachwelt hier ist die Funktion ich mit dem Schreiben endete. Funktioniert sehr gut (in einem realen Projekt getestet):

public static Control PreviousControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) - 1; i >= 0; i--) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

Um wie folgt verwendet werden:

Control panel = textBox.PreviousControl(); 

und für die nächste Kontrolle:

public static Control NextControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) + 1; i < siblings.Count; i++) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

Der Vorteil dieser Lösung gegenüber, dass von Atzoya ist erstens, dass Sie nicht die ursprüngliche Kontrolle benötigen, um eine ID zu haben, da ich die Suche basierend auf Instanz. Zweitens müssen Sie wissen, dass ASP.net mehrere Literal-Steuerelemente generiert, um Ihren statischen HTML-Code zwischen Ihren "echten" Steuerelementen darzustellen. Deshalb überspringe ich sie, oder du behältst den Müll bei. Natürlich ist der Nachteil, dass Sie kein Steuerelement finden können, wenn es ein Literal ist. Diese Einschränkung war für mich kein Problem.

1

Ich glaube nicht, dass es eine Funktion wie das gebaut ist, aber es ist sehr einfach, die Control-Klasse und fügen Sie Methoden, um es wie so zu erweitern:

ein bisschen mehr Handling Bedürfnisse
public static Control PreviousControl(this Control control) 
{ 
    for(int i=0; i<= control.Parent.Controls.Count; i++) 
     if(control.Parent.Controls[i].Id == control.Id) 
     return control.Parent.Controls[i-1]; 
} 

Natürlich hier zu tun (wenn es keine vorherige Kontrolle oder andere Szenarien gibt), aber ich denke, Sie bekommen ein Bild davon, wie das gemacht werden könnte.

Nach dieser Methode schreiben können Sie es nennen wie

Control textBox1 = textBox2.PreviousControl(); 
+3

Vielen Dank für Ihren Vorschlag, aber es hat 2 Probleme: Zuerst nehmen Sie an, dass das ursprüngliche Steuerelement eine ID haben muss, die in meinem Fall nicht gut ist. Zweitens wird Ihre Funktion den Literal-Steuerelementen entsprechen, die von ASP.net generiert werden, um Ihr statisches HTML auszugeben. Das ist ein Nein. Sehen Sie meine eigene Lösung für eine Version, die all das anspricht. – md1337

Verwandte Themen