大家好日子,
我正在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。
答案 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#代码隐藏。希望它有所帮助。
添加&lt; ASP:面板&gt;使用ID =“PanelWithLabel”和runat =“server”到您的ContentPage。
,添加一个&lt; ASP:标签&gt;控制ID =“MyLabel”。
在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;
}
}