2010-11-21 2 views
1

Ich habe eine Schaltfläche in einem Panel. Ich versuche, die ID der Schaltfläche zu finden, aber mein Code funktioniert nicht:Wie finde ich ein Steuerelement, das ich in einem Panel platziert habe?

protected void pnl_nocutomer_Load(object sender, EventArgs e) 
{ 
    Button btn; 
    btn = this.FindControl("btn_clear") as Button; 

    Page.LoadComplete += new EventHandler(Page_LoadComplete); 
    string LanguageID = Globals.GetSuitableLanguage(Page); 
    if (LanguageID == "ar") 
    { 
     btn.Text = Globals.Translate("Ok", LanguageID); 
    } 
} 
+2

Haben Sie das Markup? – Exitos

Antwort

1

Wie wäre es mit einem YourPanelName.FindControl()?

2

Findcontrol nur das Container Objekt sucht, in Ihrem Fall der Seite. Die Schaltfläche, nach der Sie suchen, befindet sich jedoch in einem Bereich, der auf der Seite enthalten ist.

Sie müssen eine rekursive Suche durchführen, um sie zu finden.

1

Ich mag die Verwendung der Funktion CoddingHorror. Behalten Sie einfach Ihr Panel als Root und die ID des gesuchten Steuerelements. Wie die vorherige Antwort erwähnt, verwendet diese Rekursion, um das Steuerelement zu finden, nach dem Sie suchen. Verwenden Sie diesen Code.

button btn = (Button)FindControlRecursive(pnl_nocustomer, "btn_clear"); 

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 
+0

Wie werden Sie diese Funktion nennen? Ist pnl_nocustomer control_id oder Steuerelement selbst oder Zeichenfolge? –

+0

der erste Parameter wäre das Steuerelement selbst, das zweite ist eine Zeichenfolge der ID, die Sie suchen. – Lareau

0

Es ist ein alter Thread, aber es ist ein Top-Suchergebnis, so dass es sich lohnt, für die anderen ein paar Notizen hier setzen zu finden:

x.FindControl alle Kontrollen durchsucht, x als den Namenscontainer haben. Das bedeutet, dass FindControl es finden wird, wenn Sie ein Steuerelement in einem Panel haben. FindControl ist NICHT darauf beschränkt, nur Steuerelemente mit übereinstimmender ID zu finden, die in x.Controls aufgeführt sind. Sie könnten sich FindControl als effektives Ausführen einer rekursiven Suche vorstellen, die nur innerhalb von untergeordneten (oder untergeordneten) Steuerelementen, die INamingContainers sind, nicht aussieht.

INamingContainers sind Steuerelemente, die ihren Inhalt als Vorlage verwenden, um Null, eine oder mehrere Kopien der Steuerelemente darin zu erstellen. z.B. Repeater usw.

Wenn Sie also ein Steuerelement in einem Repeater haben, wird es von Page.FindControl nicht gefunden. Die obige rekursive Funktion, die Page als Root verwendet, findet die erste Instanz dieses Steuerelements aus der Repeater-Vorlage. Wenn Sie wissen, dass Sie nur einen Repeater haben, dann OK, gehen Sie darauf (aber Sie könnten genauso gut die rekursive Suche auf dem Repeater-Control starten, nicht auf der ganzen Seite)

Wenn Sie Referenzen auf diese Kontrollen wollen Innerhalb von Benennungscontainern, die nicht die Seite sind, ist es besser, die Referenz vom "Sender" eines Ereignisses zu erhalten, z die OnLoad der Kontrolle, die Sie suchen. Wenn Ihr "Absender" der Benennungscontainer (Repeater-Vorlage) ist, können Sie FindControl verwenden, um zu dem Steuerelement zu gelangen, nach dem Sie suchen.

Wenn keine Repeater beteiligt waren, hatte das ursprüngliche Poster wahrscheinlich nur einen Schreibfehler (die Kontrolle heißt in der ASCX-Datei nicht btn_clear). Müsste das Markup sehen. In diesem Fall ist es wahrscheinlich, warum sie nie nachgegangen sind, aber andere, die denken, dass FindControl innerhalb eines Panels kein Steuerelement finden wird, werden wahrscheinlich diese Seite finden, weshalb ich diese Folge gepostet habe.

0

hinzufügen runat = "server" zu diesem bestimmten Element

Verwandte Themen