2010-10-11 82 views
2

我對此比較陌生,但這裏是我的問題。從孩子分享價值到家長控制

在asp.net中,我有一個父母和孩子控制。在子控件中,我有一個下拉列表。根據下拉列表中選擇的值,我想在父級控制中切換Panel的可見性。例如,如果我選擇顯示在子控件下拉列表中,我需要將true傳遞給父控件以使Panel可見,反之亦然。我應該怎麼做。我已閱讀,可以通過事件處理完成,並已看到某些情況下,但我不清楚。請幫忙!

謝謝。

回答

3

引發父控件偵聽的事件。

在後面的代碼爲你的父母控制,創建子控件的類型的對象。喜歡的東西:

private MyWebControl childControl; 

然後在子控件定義事件

public event System.EventHandler SelectionChanged; 

在你的DropDownList的OnIndexChanged情況下,你做你的處理後,提高你的事件:

if(this.SelectionChanged!= null) 
{ 
    this.SelectionChanged(this, new EventArgs()); 
    // You can send the index of the DDL in the event args 
} 

在您的家長控制中,連接事件。Page_Init是在父母控制好

this.childControl.SelectionChanged+=new EventHandler(childControl_SelectionChanged); 

儘管如此,定義方法

private void childControl_SelectionChanged(object sender, EventArgs e) 
{ 
     /// Do your processing here. 
     /// Grab the DDL's index from the EventArgs and do your processing 

} 

應該是所有你需要得到它的工作!

+0

嘿謝謝!這工作:)。在你提供的解決方案之後,我做了一些修改。非常感謝你的幫助。我真的很感激! – 2010-10-11 21:04:29

+0

不客氣!很高興我能幫到:) – TheGeekYouNeed 2010-10-11 21:25:07

+0

我應該如何在EventArgs中傳遞一個值? – 2010-11-03 13:56:39

0

一種方式做到這一點是揭露下拉列表(公共)和你的父母控制檢查孩子控制下拉菜單,看看它是否應顯示或隱藏在頁面加載的面板。如果這項工作有效或不依賴頁面生命週期。

另一種方式來做到這一點是存儲在變化事件在ViewState中的下拉值。這樣,父控件就可以讀取ViewState參數。

如果可能的話,你絕對應該去的第一個選項。

+0

但是,另一個問題是,在子控件的下拉列表中更改值時,該事件在父控件的Page_Load事件觸發後觸發,因此父控件始終將ViewState值視爲null。這適用於您的兩種解決方案。如果在父級的Page_Load之後激發子級下拉列表的SelectedIndexChanged,我無法讀取父級的值... – 2010-10-11 19:42:12

+0

嘗試檢查父級控件的「PreRender」事件中下拉列表的值。這應該發生在子控件觸發的更改事件之後。 – Merrimack 2010-10-11 19:45:58

0

基本上,你只需要訂閱SelectedIndexChanged事件和處理它。所選項目發生更改時會觸發該事件。請注意,您應該允許在下拉控件上進行自動回發,以確保在用戶更改下拉列表的值後立即觸發事件。

在ASPX文件:

< ASP:DropDownList的... OnSelectedIndexChanged = 「OnDropDownChanged」 > ... </ASP:DROPDOWNLIST >

正在創建的代碼隱藏控制的情況下,認購後創造這樣的控制:

dropDown.SelectedIndexChanged += OnDropDownChanged; 

然後處理:

public void OnDropDownChanged(object sender, EventArgs e) 
{ 
    // alter the panel's visibility here; the drop down's value contains 
    // the selected item; note that you shoud use "(DropDownList)sender" 
    // to access it 
} 

編輯:另外,看看更詳細的example on MSDN。請注意,該事件在DropDownList的祖先「ListControl」中聲明。

+0

Ondrej,這就是我試過的。在IndexChanged我設置ViewState [「HideSubmit」] = 1。在父控制的Page_Load我取的ViewState的值,但其空值。 – 2010-10-11 19:56:53

+0

正如我在更改下拉列表中的值時注意到的,第一個事件是在父級控件Page_Load中觸發的。在此範圍內,它查找的ViewState [「HideSubmit」]爲null,因爲SelectedIndexChanged事件尚未觸發,並且ViewState的值尚未設置。它在父級的Page_Load之後,它執行子控件下拉列表的SelectedIndexChanged。 – 2010-10-11 19:59:32

+0

@Ashar Syed viewstate是**本地**到控件。在父控件中訂閱子控件的事件_or_將代碼放到周圍的ASPX代碼中 - 無論這些代碼是否適合您的實際設計。 – 2010-10-11 20:18:02