2011-09-30 41 views
1

我認爲這是簡單的,但我有一個鏈接按鈕,我這樣做的單擊事件:如何動態和逐步添加控件容器

myContainer.Controls.Add(new FileUpload()); 

我想到1個新的文件控制上傳在每個點擊的容器中產生,但是,我總是得到1.我需要做什麼才能擁有多個文件上傳控件?

回答

2

由於控件是動態添加的,因此無法在回發期間存活。這意味着您必須在preinit事件中再次添加文件上傳(或任何其他動態添加的控件),以便能夠填充其值並在稍後的頁面生命週期中使用它。

聽起來像你試圖能夠上傳多個文件。您可能想要使用jQuery添加文件上傳,並使用Request.Files屬性將它們置於後端。

1

我同意Becuzz的回答。試試這個,有更好的方法來做到這一點,但是這可能會有所幫助:

添加到您的網頁

if (!IsPostBack) { 
    Session["UploadControls"] = null; 
} 

if (Session["UploadControls"] != null) { 
    if (((List<Control>)Session["UploadControls"]).Count > 0) { 
     foreach (ctrl in (List<Control>)Session["UploadControls"]) { 
      files.Controls.Add(ctrl); 
     } 
    } 
} 

的「加載」事件,也該增加的PreInit部分的頁面:

string ButtonID = Request.Form("__EVENTTARGET"); 
if (ButtonID == "Button1") { 
    FileUpload NewlyAdded = new FileUpload(); 

    List<Control> allControls = new List<Control>(); 

    if (Session["UploadControls"] != null) { 
     if (((List<Control>)Session["UploadControls"]).Count > 0) { 
      foreach (ctrl in (List<Control>)Session["UploadControls"]) { 
       allControls.Add(ctrl); 
       //Add existing controls 
      } 
     } 
    } 

    if (!allControls.Contains(NewlyAdded)) { 
     allControls.Add(NewlyAdded); 
    } 

    Session["UploadControls"] = allControls; 
} 

並將其添加到您的HTML。這當然可以任何東西:

<div id="files" runat="server"> 

</div> 

我使用了「__EVENTTARGET」值知道是什麼引起的回傳,這樣你就不會收到不需要上傳控件。

祝你好運,希望這會有所幫助。

Hanlet

+1

感謝您的源代碼。我不認爲這段代碼在回發後會保留到每個FileUpload控件的文件路徑,是嗎? – Haoest

+0

好問題。事實上它會。我只是在示例代碼中添加了另一個按鈕,它完美地工作。祝你好運! –

+0

嗯,如果我點擊瀏覽並選擇一個文件,然後點擊添加一個新的文件上傳控制,我爲上一次上傳選擇的文件路徑消失。我錯過了什麼? – Haoest