如何使用循环创建动态数量的TextBox控件?

时间:2016-06-17 13:03:01

标签: c# asp.net webforms textbox

我试图动态创建TextBox。但它不起作用。它给了我一个错误:

  

控制' 0'类型' TextBox'必须放在带有runat = server的表单标记内。

这是我的aspx代码:

<asp:Content ID="Content2" ContentPlaceHolderID="body" Runat="Server">
  <form id="form" runat="server">
    <asp:Button ID="Button2" runat="server" OnClick="show" Text="Button" />
    <asp:TextBox ID="TextBox" runat="server"></asp:TextBox>
  </form>
</asp:Content>

这是我的Codebehind:

public void show(object sender, EventArgs e)
{
    for (int i =0; i <3; i++)
    {
        TextBox _text = new TextBox();
        _text.Visible = true;
        _text.Text = i.ToString();
        _text.ID = i.ToString();
        this.Controls.Add(_text);
    }
}

3 个答案:

答案 0 :(得分:2)

即使您将控件置于 form 控件内,您也无法在回发时检索该值。

动态控制的问题是你需要在页面的每个帖子上重新加载控件(具有相同的id)。

否则,它们不会出现在控制树中,并且您无法找到它们。

这是一个示例。它动态加载TextBox控件,并在单击Submit按钮时显示该值。

ASPX

<asp:PlaceHolder runat="server" ID="PlaceHolder1" />
<asp:Button runat="server" ID="OkButton" OnClick="OkButton_Click" Text="Ok" />
<asp:Button runat="server" ID="SubmitButton" OnClick="SubmitButton_Click" Text="Submit" />
<asp:Label runat="server" ID="MessageLabel" />

代码背后

protected void Page_Init(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        LoadControls();
    }
}

protected void OkButton_Click(object sender, EventArgs e)
{
    LoadControls();
}

protected void SubmitButton_Click(object sender, EventArgs e)
{
    var myTextBox = FindControlRecursive(PlaceHolder1, "MyTextBox") as TextBox;
    MessageLabel.Text = myTextBox.Text;
}

private void LoadControls()
{
    // Ensure that the control hasn't been added yet. 
    if (FindControlRecursive(PlaceHolder1, "MyTextBox") == null)
    {
        var myTextBox = new TextBox {ID = "MyTextBox"};
        PlaceHolder1.Controls.Add(myTextBox);
    }
}

public static Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
        return root;

    return root.Controls.Cast<Control>()
        .Select(c => FindControlRecursive(c, id))
        .FirstOrDefault(c => c != null);
}

答案 1 :(得分:1)

试试这个:

this.Form.Controls.Add(_text);

错误告诉您TextBox必须位于<form>标记内。如果您将其添加到&#34;此&#34;的控件中,则会在<form>之后添加。

答案 2 :(得分:0)

form添加控件,而不是将其添加到this

for (int i =0; i <3; i++)
{
    TextBox _text = new TextBox();
    _text.Visible = true;
    _text.Text = i.ToString();
    _text.ID = i.ToString();
    form.Controls.Add(_text);
}