2016-06-14 93 views
3

我有負荷值,ASPX

<div id ="div1" runat="server"></div> 
<div id ="div2" runat="server"></div> 

和後面的代碼創建這些文本框除數像這樣

protected void Page_Load(object sender, EventArgs e){ 
for (int i = 1; i < 11; i++) 
     { 
     Control ctrl = FindControlRecursive(Page, string.Format("div{0}", i)); 
     System.Web.UI.HtmlControls.HtmlGenericControl ctrl2 = (System.Web.UI.HtmlControls.HtmlGenericControl)ctrl; 
     TextBox tbt = new TextBox(); 
     tbt.Attributes.Add("placeholder", "Title"); 
     tbt.ID = string.Format("page{0}", i); 
     ctrl2.Controls.Add(tbt); 
     ctrl2.Controls.Add(new LiteralControl(" ")); 
     TextBox tbu = new TextBox(); 
     tbu.Attributes.Add("placeholder", "URL"); 
     tbu.ID = string.Format("page{0}url", i); 
     ctrl2.Controls.Add(tbu); 

等。

我的問題是:如何在用戶點擊提交按鈕後從這些文本框中檢索文本?

我已經在stackoverflow上衝浪,但我還沒有找到解決方案。

我周圍有點擺弄着下面的代碼(基於某些計算器主題):

protected string GetTextBoxValues(object sender, EventArgs e) 
    { 
     string message = ""; 
     foreach (TextBox textBox in Controls.OfType<TextBox>()) 
     { 
      message += textBox.ID + ": " + textBox.Text + "\\n"; 
     } 
     return message; 
    } 

,然後在submit_click打印出值:

Response.Write(GetTextBoxValues(sender, e)); 

但不給我任何東西

基本上,我想要讀取每個div(包含大約6個文本框)的所有值,用分號分隔,這樣我可以進一步操縱數據

+1

在asp頁面生命週期中,你在哪裏創建文本框?它們必須被創建並可用於回發,以便將它們的值作爲控件讀取。 –

+0

文本框在page_load中創建。在我的搜索中,我發現了你說的這個「回發」,但我完全不理解它。也許你可以對此有所瞭解? – shredder

+0

如果您想做幾乎任何事情,「Postback」是理解ASP.NET最重要的事情之一。這是表單發回到它所發自的相同URL的時間。部分ASP在回發期間的工作是從http post集合中的值重新填充控制值。如果該控件在該點不存在,則不會被填充。如果你想在asp.net中做任何嚴肅的事情,我會**高度推薦你閱讀關於asp生命週期的更多內容。 –

回答

0

Controls.OfType<TextBox>是一個很好的方法,但它不是一個遞歸的方法。它會查看文本框的頁面頂部。你讓他們加入到子容器的「有意義」的名字div1div2,所以用這個:

var allTextBoxes = div1.Controls.OfType<TextBox>().Concat(div2.Controls.OfType<TextBox>()); 
foreach (TextBox textBox in allTextBoxes) 
{ 
    message += textBox.ID + ": " + textBox.Text + "\\n"; 
} 

你可以使用遞歸的方法來代替,但我強烈建議反對。你可能會發現你不想包含的文本框。

請注意,您必須在Page_Init和每次回發中創建動態控件。

+0

是的當然,謝謝。但是這些方塊仍然在返回「」:page10:\ npage10url:\ ni認爲它與第一篇文章的評論中提到的回發有關 – shredder

+0

是否在'Page_Load'的每個回發中重新創建文本框(更好'Page_Init')如上所述?您還必須分配相同的ID。 –

+0

我會用勾號標記你的答案,因爲它對我的幫助最大,儘管我用另一個forTextBoxes變量代替了我的除數 – shredder

-1

最簡單但並不優雅的方法是讓它們的ID爲靜態,然後直接從Request.Form集合中讀取。

爲了使ID靜態,補充一點:

tbt.ClientIDMode = System.Web.UI.ClientIDMode.Static; 

然後閱讀提交的值:

Request.Form.Keys.OfType<string>().ToList().FindAll(k => k.StartsWith("page")).ForEach(inputName => 
{ 
    var value = Request.Form[inputName]; 
    var index = Int32.Parse(inputName.Substring(4)); 
    //handle value... 
}); 

你可以很容易地把它變成一個Dictonary對象以及通過快速訪問index:

Dictionary<int, string> pageValues = new Dictionary<int, string>(); 
Request.Form.Keys.OfType<string>().ToList().FindAll(k => k.StartsWith("page")).ForEach(inputName => 
{ 
    var value = Request.Form[inputName]; 
    var index = Int32.Parse(inputName.Substring(4)); 
    pageValues.Add(index, value); 
});