使用母版页时访问C#中的内容控件

时间:2009-06-29 20:44:51

标签: asp.net master-pages findcontrol

大家好日子,

我正在ASP.NET中构建一个页面,并在此过程中使用母版页。

我的母版页中有一个内容地点持有人名称“cphBody”,其中包含该母版页为母版页的每个页面的正文。

在ASP.NET网页中,我有一个内容标记(引用“cphBody”),它还包含一些控件(按钮,Infragistics控件等),我想在CodeBehind文件中访问这些控件。但是,我不能直接这样做(this.myControl ...),因为它们嵌套在Content标签中。

我找到了FindControl方法的解决方法。

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

这很好用。但是,我怀疑它不是一个非常好的设计。你们知道一种更优雅的方式吗?

谢谢!

Guillaume Gervais。

5 个答案:

答案 0 :(得分:7)

我试着避免使用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";

答案 1 :(得分:4)

Rick Strahl在这里有一个很好的解释(和示例代码) - http://www.west-wind.com/Weblog/posts/5127.aspx

答案 2 :(得分:3)

没有什么可以做的。只需在子页面上编写此代码即可访问母版页标签控件。

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

答案 3 :(得分:1)

我使用此代码递归访问文件:

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

答案 4 :(得分:1)

您好以为我会分享我的解决方案,发现这适用于访问&lt;内部的'Control'。 ASP:面板&gt;它位于'ContentPage'上,但来自'MasterPage'的C#代码隐藏。希望它有所帮助。

  1. 添加&lt; ASP:面板&gt;使用ID =“PanelWithLabel”和runat =“server”到您的ContentPage。

  2. 在面板内
  3. ,添加一个&lt; ASP:标签&gt;控制ID =“MyLabel”。

  4. 在MasterPage代码隐藏中写入(或复制/粘贴以下)一个函数,如下所示:(这将访问Panel中的标签控件,这些控件都在ContentPage上,来自Master页面代码 - 后面并将其文本更改为主页面上的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;
     }
    }