动态创建ASP.NET窗体控件



我有一个表单,根据上一页给出的答案,在字段组合中可以有大约10种不同的变体(大多数是相同的,但有几个变化)。我决定,与其制作10个单独的页面,不如让它充满活力。最终,这将从数据库中提取表单设置,但目前我只是想让动态部分发挥作用。下面的代码有点工作,但它给了我一个奇怪的结果。

private void AddTestControls()
{
var newbox = new TextBox();
newbox.ID = "FirstBox";
newbox.Text = "This is dynamic";
newbox.CssClass = "stepHeader";
DynamicDiv1.Controls.Add(newbox);
var newlit = new Literal();
newlit.ID = "FirstLit";
newlit.Text = ".<br/>.";
DynamicDiv1.Controls.Add(newlit);
newbox.ID = "SecondBox";
newbox.Text = "This is also dynamic";
newbox.CssClass = "step";
DynamicDiv1.Controls.Add(newbox);
}

我已经完成了它,所有属性都得到了正确设置,但当页面最终呈现时,只有SecondBox控件可见。没有FirstBox的踪迹。如果我更改它,使SecondBox是它自己的对象(例如newebox2),那么两者都是可见的,但由于我认为我最终会从数据库中完成表单,这可能会使事情变得复杂。我不明白为什么必须重新创建文本框对象才能将其添加到Div的控件集合中。我是做错了,还是只是在某个地方错过了一步?

您的"SecondBox"正在覆盖"FirstBox"newbox,因为它仍然包含对它的引用。为第二个盒子创建一个新的TextBox

var newbox = new TextBox();
newbox.ID = "FirstBox";
newbox.Text = "This is dynamic";
newbox.CssClass = "stepHeader";
DynamicDiv1.Controls.Add(newbox);
var newlit = new Literal();
newlit.ID = "FirstLit";
newlit.Text = ".<br/>.";
DynamicDiv1.Controls.Add(newlit);
// Create a new TextBox
var secondBox = new TextBox();
secondBox.ID = "SecondBox";
secondBox.Text = "This is also dynamic";
secondBox.CssClass = "step";
DynamicDiv1.Controls.Add(secondBox);

我不太确定为什么这会使事情复杂化,但如果更容易的话,你可以创建一种创建文本框的方法:

TextBox CreateTextBox(string id, string text, string cssClass)
{
var box = new TextBox();
box.ID = id;
box.Text = text;
box.CssClass = cssClass;
return box;
}

然后

var newBox = CreateTextBox("FirstBox", "This is dynamic", "stepHeader");
DynamicDiv1.Controls.Add(newBox);

它应该如何工作。newbox1是一个参考,所以在第一次将其添加到DynamicDiv1之后,它就在那里,如果您更改其Text,那么Text就会更改。你可能会发现这很有用。这个SO展示了你所面临的同样问题。

最新更新