Доступ к управлению контентом в C # при использовании мастер-страниц - PullRequest
6 голосов
/ 30 июня 2009

Добрый день всем,

Я создаю страницу в ASP.NET и использую мастер-страницы в процессе.

У меня есть имя держателя содержимого "cphBody" на моей мастер-странице, которое будет содержать тело каждой страницы, для которой эта мастер-страница является мастер-страницей.

На веб-странице ASP.NET у меня есть тег Content (ссылающийся на «cphBody»), который также содержит некоторые элементы управления (кнопки, элементы управления Infragistics и т. Д.), И я хочу получить доступ к этим элементам управления в файле CodeBehind. Однако я не могу сделать это напрямую (this.myControl ...), поскольку они вложены в тег Content.

Я нашел обходной путь с помощью метода FindControl.

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

Это прекрасно работает. Тем не менее, я подозреваю, что это не очень хороший дизайн. Ребята, вы знаете более элегантный способ сделать это?

Спасибо!

Гийом Жерве.

Ответы [ 5 ]

7 голосов
/ 30 июня 2009

Я стараюсь избегать FindControl, если нет альтернативы, и обычно есть более аккуратный способ.

Как насчет включения пути к вашей главной странице вверху вашей дочерней страницы

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

Что позволит вам напрямую вызывать код из кода вашей главной страницы.

Затем из кода вашей главной страницы вы можете сделать свойство вернувшим ваш элемент управления, или сделать метод на главной странице, получить ваш элемент управления и т. Д.

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

Относится к метке на главной странице

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

Использование:

Master.SomethingLabel.Text = "some text";
//or
Master.SomethingText = "some text";
4 голосов
/ 30 июня 2009

У Рика Страла есть хорошее объяснение (и пример кода) здесь - http://www.west -wind.com / Weblog / posts / 5127.aspx

3 голосов
/ 06 июля 2012

Ничего другого не делать. Просто напишите этот код на дочерней странице, чтобы получить доступ к элементу управления меткой главной страницы.

Label lblMessage = new Label();
lblMessage = (Label)Master.FindControl("lblTest");
lblMessage.Text = DropDownList1.SelectedItem.Text;
1 голос
/ 08 ноября 2013

Привет, только что подумал, что поделюсь своим решением, нашел, что это работает для доступа к «элементу управления», который находится внутри , который находится на «ContentPage», но из кода C # позади «MasterPage» , Надеюсь, это поможет некоторым.

  1. добавьте с идентификатором = "PanelWithLabel" и runat = "server" в свою ContentPage.

  2. внутри Panel, добавьте элемент управления с ID = "MyLabel".

  3. напишите (или скопируйте / вставьте ниже) функцию в свой код MasterPage следующим образом: (это позволяет получить доступ к элементу управления метками внутри Panel, которые находятся на ContentPage, из кода главной страницы - позади и изменяет его текст на TextBox на главной странице:)

    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;
     }
    }
    
1 голос
/ 30 июня 2009

Я использую этот код для доступа к файлам рекурсивно:

    /// <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);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...