从代码后端创建aspx文本框

4
如何在C#的代码后端创建aspx文本框,以及如何在代码后端访问其值?我按照以下方式操作,但每个postback时文本框都被清除了。我需要在postback时保留它的值。
TextBox txt = new TextBox();
txt.ID = "strtxtbox";
txt.CssClass = "CSS1";
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
txt.RenderControl(htmlWriter);

//lbl is an aspx label
lbl.text += @"<td style='width: 5%;'>" + sb.ToString() + "</td>";

我可以这样访问文本框的值:

string tb = Request.Form["strtxtbox"].ToString();

文本框 myTextBox = new TextBox(); - Massimiliano Peluso
你能详细说明一下你想做什么吗?如果你在代码后台处理所有事情,那么从TextBox获取输入和读取将会非常困难。虽然这是可能的,但代码会变得非常丑陋和低效。如果你能提供更多细节,那就太好了。 - tmesser
4个回答

6
您可以创建TextBox控件来开始操作。必须在 Init() (Page_Init()) 或 PreInit() (Page_PreInit()) 方法中完成,而且无论是否 Page.IsPostBack 都需要执行。这将在 ViewState 被加载之前将元素放置在页面上,并允许您在 postback 时检索其值。
var textBox = new TextBox();

然后你需要设置一些属性,包括一个ID以便以后查找:
textBox.ID = "uxTxtSomeName";
textBox.MaxLength = 10; // maximum input length
textBox.Columns = 20; // character width of the textbox
etc...

然后您需要将它添加到页面上的适当容器中(Page 或任何您想要它显示在其中的控件):

parentControl.Controls.Add(textBox);

然后在提交回传时,您可以使用父控件的 FindControl() 函数,在Load()方法(Page_Load())中检索值:

var input = (parentControl.FindControl("uxTxtSomeName") as TextBox).Text;

注意:内置的FindControl()仅迭代直接子级。如果您想搜索嵌套服务器控件的整个树,则可能需要实现自己的递归FindControl()函数。但是,在[so]上有数百万个递归FindControl()函数的示例,所以我将把这个留给您。

2
如果他将变量定义为类级别变量,那么在Load()方法中,他可以直接引用他在Init()中创建的textBox变量,而不必使用findControl。 - Jason Coyne


1
问题在于,除非每次重新创建控件,否则在回发时该控件将不可用,这是有问题的。
过去我用过的一个解决方案是DynamicControlsPlaceholder,您可以在这里查看。

0
根据注释中的代码创建文本框。
TextBox myTextBox=new TextBox();

然而,您必须设置一个ID/名称。此外,您必须在每次回发之前或预呈现中创建文本框,以便值将被填充。如果您延迟在页面生命周期的后期创建文本框,则该值将无法从回发中填充,然后您将不得不手动从Request.Response[]集合中检索它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接