从动态创建的TextBox,ASPx加载值

时间:2016-06-14 13:41:25

标签: c# asp.net

在我的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中浏览过,但我还没有找到解决方案。

我已经使用以下代码(基于一些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个文本框),用分号分隔,这样我就可以进一步操作数据

2 个答案:

答案 0 :(得分: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和每次回发中创建动态控件。

答案 1 :(得分:-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对象中,以便快速访问索引:

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);
});