C# 如何从内容页访问母版页上的.Net元素?

C# 如何从内容页访问母版页上的.Net元素?,c#,.net,C#,.net,是否可以从母版的ContentPlaceHolder中加载的页面访问母版页上的元素 我有一个ListView,它在母版页的导航区域中列出了人们的姓名。我想在将一个人添加到ListView数据绑定到的表之后更新ListView。在重新加载缓存之前,列表视图当前不会更新其值。我们发现,只需重新运行ListView.DataBind()即可更新ListView的内容。我们无法在使用母版页的页面上运行ListView.DataBind() 下面是我想做的一个示例,但编译器错误显示 “PeopleList

是否可以从母版的
ContentPlaceHolder
中加载的页面访问母版页上的元素

我有一个ListView,它在母版页的导航区域中列出了人们的姓名。我想在将一个人添加到ListView数据绑定到的表之后更新ListView。在重新加载缓存之前,
列表视图当前不会更新其值。我们发现,只需重新运行
ListView.DataBind()
即可更新ListView的内容。我们无法在使用母版页的页面上运行
ListView.DataBind()

下面是我想做的一个示例,但编译器错误显示

“PeopleListView在当前上下文中不存在”

GIS.master-ListView所在的位置

...<asp:ListView ID="PeopleListView"...

在C#.Net中解决此类问题的最佳方法是什么?

假设您的母版页名为MyMaster:

(Master as MyMaster).PeopleListView.DataBind();
编辑:由于默认情况下PeopleListView将被声明为受保护,因此您需要将其更改为public,或者创建一个public属性包装器,以便您可以从页面访问它。

我相信您可以使用this.Master.FindControl或类似的工具来实现这一点,但您可能不应该这样做——它要求内容页对母版页的结构了解得太多


我建议使用另一种方法,例如在内容区域触发一个事件,主机可以在触发时侦听并重新绑定该事件。

假设该控件在母版页上被称为“PeopleListView”

ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView");
peopleListView.DataSource = [whatever];
peopleListView.DataBind();

但是@更为正确,尤其是当您的页面可能有多个母版页时。将它们解耦并使用一个事件。

需要记住的是以下ASP.NET指令

<%@ MasterType attribute="value" [attribute="value"...] %>


它将通过创建母版页的强类型引用来帮助您引用此.Master。然后,您可以引用ListView而无需强制转换。

您可以使用代码this.Master.FindControl(ControlID)访问所需的控件。它返回控件的引用,以便更改有效。不可能在每种情况下都触发事件

选项1:您可以创建母版页控件的公共属性

public TextBox PropMasterTextBox1
{
    get { return txtMasterBox1; }
    set { txtMasterBox1 = value; }
}
在内容页上访问它,就像

Master.PropMasterTextBox1.Text="SomeString";
备选案文2: 在母版页上:

public string SetMasterTextBox1Text
{  
    get { return txtMasterBox1.Text; }
    set { txtMasterBox1.Text = value; }
}
在内容页上:

Master.SetMasterTextBox1Text="someText";
备选案文3: 您可以创建一些适用于您的公共方法



这些方法不是很有用,但如果您只想使用一些有限的预定义控件,它会有所帮助

谢谢,这很有效。但是,您需要强制转换它:((myMasterPage)Master);这取决于您的实现。。。对于单个母版页,不需要这样做。而您的实际实现将比这样的基本示例(如打印“Hello World!”)复杂得多。这是我使用的方法,没有Serguei的额外更改。很好地完成了我所需要的。可能也应该被标记为答案+1.
Master.SetMasterTextBox1Text="someText";