我试图动态创建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);
}
}
答案 0 :(得分:2)
即使您将控件置于 form 控件内,您也无法在回发时检索该值。
动态控制的问题是你需要在页面的每个帖子上重新加载控件(具有相同的id)。
否则,它们不会出现在控制树中,并且您无法找到它们。
这是一个示例。它动态加载TextBox控件,并在单击Submit按钮时显示该值。
<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);
}