2008-08-08 49 views
11

是否可以從主頁上的ContentPlaceHolder加載的頁面訪問母版頁上的元素?如何從內容頁面訪問母版頁上的.Net元素?

我有一個列表視圖,列出主頁面上的導航區域中的人名。我想在一個人被添加到ListView數據綁定到的表之後更新ListView。在重新加載緩存之前,ListView當前不更新其值。我們發現只要重新運行ListView.DataBind()就會更新一個listview的內容。我們無法在使用母版頁的頁面上運行ListView.DataBind()

下面是我想要做的樣品,不過編譯錯誤說

「PeopleListView不會在當前的背景下存在」

GIS.master - 哪裏的ListView駐留

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

GISInput_People.aspx - 使用GIS.master,因爲它的母版頁

GISInput_People.aspx.cs

AddNewPerson() 
{ 
    // Add person to table 
    .... 

    // Update Person List 
    PeopleListView.DataBind(); 
    ... 
} 

什麼是解決這樣一個問題,在C#.NET的最佳方式?

回答

17

我相信你可能通過使用this.Master.FindControl或類似的東西來做到這一點,但你可能不應該 - 它需要內容頁面知道太多關於母版頁的結構。

我會建議另一種方法,例如在內容區域觸發一個事件,主控制器可以監聽並重新綁定。

-1

假設你的母版頁被評爲MyMaster:

(Master as MyMaster).PeopleListView.DataBind(); 

編輯:因爲PeopleListView將被宣佈默認保護,你要麼需要將其更改爲公共,或創建一個公共屬性包裝,以便你可以從你的頁面訪問它。

4

假設控制被稱爲「PeopleListView」母版頁

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

上,但@palmsey是比較正確的,特別是如果你的頁面可能不止一個母版頁的可能性。將它們解耦並使用事件。

1

一個想到的是以下的ASP.NET指令。

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

MSDN Reference

通過創建一個強類型引用母版頁引用this.Master時,它會幫助你。然後您可以引用您的ListView而不需要CAST。

0

你可以用代碼訪問this.Master。FindControl(ControlID)控制你想要的。它返回控件的引用,以便更改生效。關於發射一個事件不可能的每個情況。

2

選擇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: 您可以創建適用於您


這些做法是不那麼有用的一些公共方法,但它幫助,如果你只是想使用一些有限的和預定義的控制

+0

謝謝,這個作品。但是,您需要投它: ((myMasterPage)Master).SetMasterTextBox1Text =「someText」; – 2013-07-03 16:01:42

相關問題