2012-03-29 1 views
2

Wie kann ich auf programmgesteuerte Weise auf ein Steuerelement auf einer ASPX-Seite aus der CS-Datei zugreifen?Wie programmgesteuert auf ein Steuerelement auf einer ASPX-Seite aus der CS-Datei zugreifen

Zum Beispiel, wenn ich eine Reihe von asp: Panel-Steuerelemente jeweils mit einer ID von einer Stadt (ID = "Atlanta", ID = "Chicago", ID = "Pittsburgh", etc.) und dann in die cs Ich greife einen Wert von der Datenbank, um zu den Kontrollnamen zu passen, was würde ich verwenden?

Ich habe versucht, FindControl() zu verwenden, wie gezeigt, und es gibt null zurück.

aspx Seite:

<asp:Panel ID="atlanta" runat="server" Visible="false"></asp:Panel> 

cs-Datei:

controlName = storeLocation.City.ToLower(); 
Panel cityPanel = (Panel)FindControl(controlName); 
cityPanel.Visible = true; 

Ich nehme an Findcontrol() für den Einsatz wirklich in Fällen wie Repeatern oder Grids ist, wo Sie in der ItemTemaplate passieren. In meinem Fall ist es nur eine einfache Inhaltsseite mit einem Inhalts-Tag mit einer Reihe von Panels darin.

Vielen Dank im Voraus! :)

+0

hast du meine Antwort überprüft? Ich habe es in meiner Maschine versucht und es scheint zu funktionieren. Ich bin neugierig... – daniloquio

Antwort

3

FindControl() ist nicht rekursiv, was Ihr Problem sein kann. Es gibt jedoch viele Implementierungen einer rekursiven Version, beispielsweise this one.

Wenn Sie die Bedienfelder dynamisch erstellen und später im Seitenlebenszyklus darauf zugreifen möchten, können Sie sie alle zu einer Dictionary<string, Panel> hinzufügen, wobei die ID der Schlüssel ist.

+0

Danke, das funktioniert definitiv. Wie andere bemerkt haben, könnte die Rekursion besteuert werden, aber die Struktur der aspx-Seite in ihrem aktuellen Zustand sollte kein Problem sein. Wenn es sich ändert und komplexer wird, könnte das ein Problem sein, aber ich sehe nicht voraus, dass diese Seite etwas anderes als Kopieren/Text ändern wird. – Dmase05

+0

Froh, dass es funktioniert. Wenn Sie die direkten Eltern aller Elemente kennen, können Sie Rekursionen vermeiden, aber ansonsten würde ich mir keine Sorgen machen. Die Rekursion durch wenige Kontrollstufen ist sehr kostengünstig. –

2

Sie können diese Erweiterungsmethode verwenden Kontrollen rekursiv zu finden:

public static class ControlExtension 
{ 

    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control child in control.GetAllControls()) 
      { 
       yield return child; 
      } 
     } 
    } 
} 

Und dann hinter Seite in Ihrem Code, den Sie so etwas tun könnte, wenn Sie Ihre Etiketten Präfix:

IEnumerable<Control> city_controls = this.GetAllControls().Where(x => x.Id.Contains("city_")) 

oder ein Einzelsteuerung:

var city = this.GetAllControls().Single(x => x.Id = "atlanta"); 

Wo die this ist Ihre ASPX Code hinter Seite.

Es funktioniert auch auf Kontrollen wie Platten, so dass, wenn Sie alle Steuerelemente in einem Panel finden usw.

1

Wenn Sie die Kontrolle enthalten wissen können Sie in der Lage sein, die FindControl() Funktion dieses Steuerelement verwenden zu finden es. Diese Methode ist viel schneller und sicherer als eine rekursive Methode.

Microsoft hat eine rekursive FindControl() Funktion aus einem Grund nicht enthalten, es wird Ihre Seite im Laufe der Zeit verlangsamen, wie mehr Steuerelemente auf der Seite hinzugefügt werden. Wenn dies nicht funktioniert, verwenden Sie eine rekursive Funktion wie andere vorgeschlagene Antworten.

+0

Ich habe auch Probleme damit. Der Versuch, eine 'FindControl()' auf dem Inhalt enthaltenden Platzhalter zu tun, gibt ebenfalls null zurück. – Dmase05

1

Dies sollte für Sie arbeiten, da die Panels im asp: Content Steuerelement verschachtelt sind.

Panel cityPanel = 
(Panel)Master.FindControl("ContentPlaceHolderId").FindControl(controlName); 

Wo vom Kurs abgekommen, ContentPlaceHolderID die ID des entsprechenden Content in der Master-Seite, die Sie implementieren ist.

+0

Ich kann das nicht zur Arbeit bringen. Also, wenn ich dies in der aspx: '' ich im cs haben sollte: 'Panel-concentrationPanel = (Panel) Master.FindControl ("cphInteriorBody"). FindControl (controlName); ' – Dmase05

+0

@ DMase05 Ja, das ist die Art und Weise, die ich verwendet habe und es hat für mich funktioniert, es tut mir leid, es funktioniert nicht für Sie. Wie Sie in einer anderen Antwort gesagt haben, wird die Rekursion mit Sicherheit funktionieren. – daniloquio

+0

Ja, ich bin wirklich verblüfft, da ich erwarte, dass es auch funktioniert. Danke trotzdem! – Dmase05