Domanda

Buon giorno a tutti,

Sto costruendo una pagina in ASP.NET, e l'utilizzo di pagine master nel processo.

Ho un posto nome Holder Content "cphBody" nella mia pagina master, che conterrà il corpo di ogni pagina per la quale il Maestro pagina è la pagina master.

Nella pagina Web ASP.NET, ho un tag Content (riferimento "cphBody"), che contiene anche alcuni controlli (pulsanti, controlli Infragistics, ecc), e voglio accedere a questi controlli nel file CodeBehind. Tuttavia, non posso farlo direttamente (this.myControl ...), dal momento che sono annidati nel tag contenuti.

Ho trovato una soluzione con il metodo FindControl.

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

Che funziona bene. Tuttavia, sto sospettando che non è un buon design. Do you guys conoscere un modo più elegante per farlo?

Grazie!

Guillaume Gervais.

È stato utile?

Soluzione

Rick Strahl ha una buona spiegazione (e codice di esempio) qui - http: //www.west-wind.com/Weblog/posts/5127.aspx

Altri suggerimenti

I cercare di evitare FindControl meno che non ci sono alternative, e di solito c'è un modo più ordinato.

Come circa tra cui il percorso della pagina master nella parte superiore della pagina figlio

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

che vi permetterà di chiamare direttamente il codice dal codice pagina master alle spalle.

Poi dal codice pagina master alle spalle si potrebbe fare una proprietà restituire il vostro controllo, o fare un metodo sulla pagina master ottenere il vostro controllo, ecc.

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

Si riferisce ad un'etichetta sulla pagina master

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

Utilizzo:

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

Niente da fare diverso. Basta scrivere il codice sulla pagina figlio per accedere al controllo dell'etichetta pagina master.

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

Io uso questo codice per l'accesso ai file in modo ricorsivo:

    /// <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);
            }
        }

Ciao appena ho pensato di condividere la mia soluzione, ha trovato questo funziona per l'accesso a un 'controllo' che si trova all'interno di un che si trova su un 'ContentPage', ma da C # code-behind della 'MasterPage' . Speranza che aiuta un po '.

  1. aggiungere un con un ID = "PanelWithLabel" e runat = "server" al tuo ContentPage

  2. .
  3. all'interno del pannello, aggiungere un. di controllo con ID = "MyLabel"

  4. write (o copia / incolla il seguente) una funzione nella vostra MasterPage Codice-dietro come segue: (questo accede al controllo etichetta, all'interno del pannello, che sono entrambi sulla ContentPage, dalla pagina master code- alle spalle e cambia il suo testo per essere quella di un TextBox nella pagina master:)

    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;
     }
    }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top