2016-06-14 167 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); 
});