动态创建文本输入(ASP.net/C#)

时间:2009-01-11 21:23:39

标签: c# asp.net

我的页面上有一个输入字段,用户将在其中键入要创建的文本输入的数量。按钮的操作是:

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”。

2 个答案:

答案 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方法中执行此操作。

编辑:如果在回发时减少文本字段的数量,则会出现此问题。应该采用一些安全的方法在回发时重新创建以前的文本字段。