【问题标题】:How can I read a dynamically created textbox如何阅读动态创建的文本框
【发布时间】:2009-07-10 15:30:44
【问题描述】:
我在占位符中创建了一些动态文本框和一个按钮,并希望在单击按钮时将信息保存在文本框中,但不确定如何从文本框中检索数据
LiteralControl spacediv3 = new LiteralControl("  ");
Label lblComText = new Label();
lblComTitle.Text = "Comment";
TextBox txtComment = new TextBox();
txtComment.Width = 200;
txtComment.TextMode = TextBoxMode.MultiLine;
phBlog.Controls.Add(lblComText);
phBlog.Controls.Add(spacediv3);
phBlog.Controls.Add(txtComment);
Button btnCommentSave = new Button();
btnCommentSave.ID = "mySavebtnComments" ;
btnCommentSave.Text = "Save ";
phBlog.Controls.Add(btnCommentSave);
btnCommentSave.CommandArgument = row["ID"].ToString();
btnCommentSave.Command += new CommandEventHandler(btnSave_Click);
protected void btnSave_Click(object sender, CommandEventArgs e)
{
firstelement.InnerText = txtComment.text // this gives error on txtComment.text
}
【问题讨论】:
标签:
c#
asp.net
dynamic
controls
【解决方案1】:
您需要在 btnSave_Click 中获取对您的控件的引用。比如:
protected void btnSave_Click(object sender, CommandEventArgs e)
{
var btn = (Button)sender;
var container = btn.NamingContainer;
var txtBox = (TextBox)container.FindControl("txtComment");
firstelement.InnerText = txtBox.text // this gives error on txtComment.text
}
您还需要在 txtComment 上设置 ID,并在回发时重新创建任何动态创建的控件。
【解决方案2】:
显然,您需要一些机制来创建 Button 和 TextBox 之间的关系。在 winforms 中这很容易,每个控件都有一个 Tag 属性,它可以包含对几乎任何东西的引用。 Web 控件没有这样的属性(据我所知),但维护这样的关系仍然很容易。一种方法是在存储按钮/文本框关系的页面中使用Dictionary:
private Dictionary<Button, TextBox> _buttonTextBoxRelations = new Dictionary<Button, TextBox>();
当您创建按钮和文本框控件时,您将它们插入到字典中:
TextBox txtComment = new TextBox();
// ...
Button btnCommentSave = new Button();
// ...
_buttonTextBoxRelations.Add(btnCommentSave, txtComment);
...然后你可以在按钮的点击事件中查找文本框:
protected void btnSave_Click(object sender, CommandEventArgs e)
{
TextBox commentTextBox = _buttonTextBoxRelations[(Button)sender];
firstelement.InnerText = txtComment.text // this gives error on txtComment.text
}
【解决方案3】:
在调用 base.LoadViewState 后,在回发期间尝试在重写的 LoadViewState 方法中加载 txtComment(具有相同的 ID)。在这种情况下,您确实在处理回发数据并加载 txtComment 控件之前加载它。
【解决方案4】:
在文本框中添加一个“ID”
txtComment.ID = "txtComment"
从提交的表单中请求信息(前提是页面上有表单)
comment = Request.Form("txtComment")