我的页面上有一个输入字段,用户将在其中键入要创建的文本输入的数量。按钮的操作是:
int num_flds = int.Parse(a_fld.Text);
for (int i = 0; i < num_flds; i++)
{
TextBox tmp = new TextBox();
tmp.ID = "answer_box" + i;
tmp.Width = Unit.Pixel(300);
answer_inputs.Controls.Add(tmp);
}
现在,我有另一个按钮,用户在填写所有动态创建的文本框后会单击该按钮。问题,首先,我是否在正确的位置动态创建文本框?如何从动态创建的文本框中获取值? (动态创建的文本框将添加到面板“answer_inputs”。
答案 0 :(得分:2)
我建议阅读this以及其他一些有关动态创建控件主题的文章。它并不像你想象的那么简单。有一些重要的页面生命周期问题需要考虑。
答案 1 :(得分:2)
动态创建Web控件时,我发现最好让控件本身在答案中报告。你可以这样做:
在您的Page类中创建一些内容来存储值:
private readonly Dictionary<TextBox, string> values=new Dictionary<TextBox, string>();
创建一个方法,在文本框的值发生变化时充当文本框的回调:
void tmp_TextChanged(object sender, EventArgs e)
{
TextBox txt = sender as TextBox;
if(txt!=null)
{
values.Add(txt,txt.Text);
}
}
然后在添加时将此方法添加到每个文本框中:
int num_flds;
if(!int.TryParse(a_fld.Text,out num_flds))
{
num_flds = 0;
}
for (int i = 0; i < num_flds; i++)
{
TextBox tmp = new TextBox();
tmp.ID = "answer_box" + i;
tmp.Width = Unit.Pixel(300);
answer_inputs.Controls.Add(tmp);
tmp.TextChanged += tmp_TextChanged;
}
最后,您在回调中遍历字典以查看它是否包含任何值。例如,在OnPreRender方法中执行此操作。
编辑:如果在回发时减少文本字段的数量,则会出现此问题。应该采用一些安全的方法在回发时重新创建以前的文本字段。