2012-11-26 48 views
0

我想用新的動態控件填充一個updatepanel來響應按鈕的點擊。如何創建動態控件以響應按鈕單擊?

但是,我也希望能夠訪問這些動態控件的值,以響應其中一個控件中的事件。

具體來說,我想要按鈕來調出兩個下拉菜單。其中一個菜單(或者兩者都需要)位於另一個更新面板中。我希望更新面板中的第一個菜單更改其數據,以響應在其他菜單中選擇的值。

我想我的問題是,當我用一個dropdownmenu導致回發時,我失去了其他dropdownmenu,因爲我在button_click處理程序中創建了它。

我知道我應該在Page_Init方法中創建動態控件(或者聽說過),但我只想讓按鈕被點擊時顯示控件。頁面上還有其他按鈕需要創建一組不同的動態控件。

謝謝。

+0

如果它始終是相同的2個控件,則只需製作不可見/禁用的控件,然後在您的事件中啓用/顯示它們。 –

+0

我考慮過這個,但按鈕實際上是基於複選框創建控件的。也就是說,它會對我檢查的每個複選框提及的兩個控件進行檢查,並且總數複選框數量可變。所以我認爲,如果我需要做出隱藏的控制,我不知道要做多少。 – Mason

回答

0

有很多方法可以處理這種情況,採取的方法取決於您的項目需求和可用資源。

最平滑的方式來做到這一點,通常會提供最佳的用戶體驗將是使用JavaScript技術來隱藏和顯示控件,因爲頁面需要它們。 JQuery是我爲此推薦的圖書館。在最基本的層面上,你只需連線控件的激活(如button_click事件)和隱藏或顯示包含必要的動態內容的DIV,像這樣:

$("#control").show(); 
// and 
$("#control").hide(); 

或者,你可以在C#這樣做通過在ASP.NET的許多常規Web控件上使用Visible屬性。通常的代碼隱藏方法將是這個樣子:

private void btnControl_Click(object sender, EventArgs e) 
{ 
    var dynamicControl1 = FindControl("dynamicControl1"); 
    dynamicControl.Visible = false; // or true, as the case may be 
} 

這種特殊的方法主要是連接到代碼的屁股,不過,我會鼓勵你,以避免可能的話。他們實際上不可能測試,並且會讓項目感到痛苦。您可以在MVC3框架中使用類似的方法,當然,如果您發送和接收您設置的控件不是可見。這樣做的另一個好處是,如果某些東西被設置爲不可見,它甚至不會顯示在由模板引擎生成的HTML中(YMMV取決於引擎,但我知道這是真的剃刀)。因此,查看網頁來源的人將無法看到不活動的控件,這可能會或可能不會吸引您。

編輯:我看到的問題是如何顯示這些東西,以及如何創建和讀取它們返回給定的動態輸入更少。我相信有一種方法可以用Javascript來做到這一點(這可能是最乾淨和最好的方式來做到這一點),但是我不能用JS知道那個答案。你在ASP.NET中處理這個問題的方式是讓你將控件添加到服務器端(通過使用runat='server',然後在那裏添加你需要的東西)。同樣,簡單的代碼隱藏方法可能類似於:

private void btnControl_Click(object sender, EventArgs e) 
{ 
    foreach(var checkBoxChecked in chkBoxes.Where(x => x.Checked)) 
    { 
     div.Controls.Add(new WebControl()) // or whatever the heck else it is you need. 
    } 
} 

這當然假設你有一個IEnumerable<CheckBox>迭代。您可能還需要一個IList<WebControl>來跟蹤您添加的所有垃圾。您還需要確保將CSS正確應用於您添加的控件的div。再次,代碼隱藏是非常糟糕的,我僅僅使用這個例子,因爲它很容易在項目中啓動以便自己測試。

相關問題