2009-06-29 2 views
6

Guten Tag alle,Zugriff auf eine Inhaltskontrolle in C# bei der Verwendung von Masterseiten

ich eine Seite in ASP.NET den Aufbau und die Verwendung von Masterseiten in den Prozess.

Ich habe einen Content-Place-Holder-Namen "cphBody" in meiner Masterseite, der den Körper jeder Seite enthält, für die diese Masterseite die Masterseite ist.

In der ASP.NET-Web-Seite habe ich ein Content-Tag (Verweis "CphBody"), die auch einige Steuerelemente (Schaltflächen, Infragistics-Steuerelemente usw.) enthält, und ich möchte auf diese Steuerelemente in der CodeBehind-Datei zugreifen. Dies kann ich jedoch nicht direkt tun (this.myControl ...), da sie im Content-Tag verschachtelt sind.

Ich habe eine Problemumgehung mit der FindControl-Methode gefunden.

ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder) Master.FindControl("cphBody"); 
ControlType myControl = (ControlType) contentPlaceHolder.FindControl("ControlName"); 

Das funktioniert gut. Ich vermute jedoch, dass es kein sehr gutes Design ist. Kennst du einen eleganteren Weg?

Vielen Dank!

Guillaume Gervais.

+1

versuchen Sie, die Steuerelemente aus der Inhaltsseite der Code-Behind zuzugreifen oder die Masterseite des Code hinter? – wulimaster

+0

Der CodeBehind der Inhaltsseite. –

+0

Das ist seltsam. Sie sollten direkt von der Code-Behind-Funktion Ihrer Content-Seite aus auf Ihre Steuerelemente zugreifen können, sofern sie nicht dynamisch erstellt und hinzugefügt werden. –

Antwort

4

Rick Strahl eine gute Erklärung hat (und Code-Beispiel) hier - http://www.west-wind.com/Weblog/posts/5127.aspx

+0

Danke! Das ist im Grunde, was ich getan habe, also bestätigt es meine Methode für mich! –

+0

Ich mag FindControl wirklich nicht, es wird normalerweise nur benötigt, wenn Sie keine stark typisierte Eigenschaft verfügbar machen können und Sie die vorgerenderte Ausgabe durchsuchen müssen. – CRice

1

Ich benutze diesen Code für acess Dateien rekursiv:

/// <summary> 
    /// Recursively iterate through the controls collection to find the child controls of the given control 
    /// including controls inside child controls. Return all the IDs of controls of the given type 
    /// </summary> 
    /// <param name="control"></param> 
    /// <param name="controlType"></param> 
    /// <returns></returns> 
    public static List<string> GetChildControlsId(Control control, Type controlType) 
    { 
     List<string> FoundControlsIds = new List<string>(); 
     GetChildControlsIdRecursive(FoundControlsIds, control, controlType); 

     // return the result as a generic list of Controls 
     return FoundControlsIds; 
    } 

    public static List<string> GetChildControlsIdRecursive(List<string> foundControlsIds, Control control, Type controlType) 
    { 
     foreach (Control c in control.Controls) 
     { 
      if (controlType == null || controlType.IsAssignableFrom(c.GetType())) 
      { 
       // check if the control is already in the collection 
       String FoundControl = foundControlsIds.Find(delegate(string ctrlId) { return ctrlId == c.ID; }); 

       if (String.IsNullOrEmpty(FoundControl)) 
       { 
        // add this control and all its nested controls 
        foundControlsIds.Add(c.ID); 
       } 
      } 

      if (c.HasControls()) 
      { 
       GetChildControlsIdRecursive(foundControlsIds, c, controlType); 
      } 
     } 
7

Ich versuche und Findcontrol zu vermeiden, es sei denn es gibt keine Alternative, und es gibt normalerweise einen besseren Weg.

Wie wäre es den Pfad zu Ihrer Masterseite an der Spitze Ihres Kindes Seite

<%@ MasterType VirtualPath="~/MasterPages/PublicUI.Master" %> 

einschließlich der Sie direkt erlauben wird, hinter Code von Ihrem Master-Seite Code aufrufen.

dann von Ihrem Master-Seite Code hinter Ihnen eine Eigenschaft Ihrer Kontrolle zurückkehren konnten oder ein Verfahren machen auf der Master-Seite erhalten Sie Ihre Steuerung usw.

public Label SomethingLabel 
{ 
    get { return lblSomething; } 
} 
//or 
public string SomethingText 
{ 
    get { return lblSomething.Text; } 
    set { lblSomething.Text = value; } 
} 

Bezieht sich auf einem Etikett auf der Masterseite

<asp:Label ID="lblSomething" runat="server" /> 

Verbrauch:

Master.SomethingLabel.Text = "some text"; 
//or 
Master.SomethingText = "some text"; 
+0

Was ist umgekehrt? Ich habe eine 'GridView' auf meiner Inhaltsseite und möchte diese von meiner MasterPage aus aktualisieren können. – Si8

+0

Ich würde ein Ereignis mit den Ereignisdaten, die Sie benötigen, auf der Masterseite auslösen und mit Ihrer Seite abonnieren. Master.SomeEvent + = SomeHandler; – CRice

3

nichts anderes zu tun. Schreiben Sie diesen Code einfach auf die untergeordnete Seite, um auf das Steuerelement der Masterseitenbeschriftung zuzugreifen.

Label lblMessage = new Label(); 
lblMessage = (Label)Master.FindControl("lblTest"); 
lblMessage.Text = DropDownList1.SelectedItem.Text; 
1

Hallo dachte nur, ich würde meine Lösung teilen, fand dies funktioniert eine ‚Control‘ für den Zugriff auf die innerhalb eines < asp ist: Panel>, die auf einem ‚Content‘ ist, aber von C# -Code-behind von die "MasterPage". Hoffe es hilft einigen. Panel> mit ID = "PanelWithLabel" und runat = "server", um Ihren Content:

  1. eine < asp hinzufügen.

  2. innerhalb des Panels fügen Sie eine < asp: Label> Steuerelement mit ID = "MyLabel".

  3. schreiben (oder kopieren/fügen Sie die unten) eine Funktion in Ihrem MasterPage Code-Behind wie folgt: (Dies greift auf das Label-Steuerelement im Panel, die beide auf der ContentPage sind, von der Master-Seite Code-behind und ändert der Text des einen TextBox auf der Master-Seite sein :)

    protected void onButton1_click(object sender, EventArgs e) 
    { 
    // find a Panel on Content Page and access its controls (Labels, TextBoxes, etc.) from my master page code behind // 
    System.Web.UI.WebControls.Panel pnl1; 
    pnl1 = (System.Web.UI.WebControls.Panel)MainContent.FindControl("PanelWithLabel"); 
    if (pnl1 != null) 
    { 
        System.Web.UI.WebControls.Label lbl = (System.Web.UI.WebControls.Label)pnl1.FindControl("MyLabel"); 
        lbl.Text = MyMasterPageTextBox.Text; 
    } 
    } 
    
Verwandte Themen