存储动态插入的控件数量以进行回发

时间:2010-06-25 01:40:20

标签: c# .net user-controls webforms dynamic-usercontrols

我需要创建以下功能,并寻找在多个回发上存储信息的最佳方式:

假设我有一个与问题相关的TextBox,即“我去过的地方”。一旦TextBox将在第一次加载时加载。在那之下,有一个“添加另一个地方”的按钮。这将回发,然后在第一个下面添加另一个TextBox。这可以做x次。

我的问题是,我如何存储/记住用户添加到页面中的控件数量,考虑到需要在Init事件中完成此加载,并且未加载ViewState点?

修改*:

我忘了提及,当用户保存时,会有一些验证,所以如果验证失败,需要显示所有TextBox,以及他们发布的数据。

3 个答案:

答案 0 :(得分:1)

如果您只允许在表单上使用有限数量的文本框,则可以在Page_Init期间创建该数量的文本框,并将其可见性设置为false,以便它们不会在浏览器中呈现。在按钮的单击事件中,您可以找到第一个不可见的文本框,并将可见性更改为true。像这样的东西

protected void Page_Init(object sender, EventArgs e)
{
    for (int i = 0; i < 20; i++)
    {
        this.Form.Controls.Add(new TextBox() { Visible = false });
    }
}

protected void addTextboxButton_Click(object sender, EventArgs e)
{
    TextBox tb = this.Form.Controls.OfType<TextBox>().FirstOrDefault(box => box.Visible == false);
    if (tb != null) tb.Visible = true;
}

使用这种方法,每次点击按钮时文本框会逐一显示,并且回发值会保持不变。

显然,你想要做更多的工作,例如定义一些文字控件来创建文本框的换行符和提示,以及当用户达到你设置的任何有限限制时显示一条消息。

答案 1 :(得分:0)

选项1:您可以使用Session来存储文本框的数量......

选项2:您甚至可以在页面的Load事件中添加控件,其中您将获得ViewState信息。

以下链接可以帮助您......

TRULY understanding Dynamic Controls

Truly Understanding ViewState

答案 2 :(得分:0)

经过一番思考,并考虑到给出的答案,提出了这个解决方案。

在控件占位符中,有一个隐藏的输入字段,用于存储添加到页面的控件数。然后,在Init上,我可以使用以下代码(仅测试):

protected override void OnInit(EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value);

    if(Request.Params[hdnTestCount.UniqueID] != null)
    {
        i = Int32.Parse(Request.Params[hdnTestCount.UnitueID]);
    }

    for (int j = 1; j <= i; j++)
    {
         TextBox txtBox = new TextBox();
         txtBox.ID = "Test" + j.ToString();
         plhTest.Controls.Add(txtBox);
    }
}

protected void btnAdd_OnClick(object sender, EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value) + 1;

    TextBox txtBox = new TextBox();
    txtBox.ID = "Test" + i.ToString();
    plhTest.Controls.Add(txtBox);
    hdnTestCount.Value = i.ToString();
}

当然唯一的问题是,用户可以在隐藏字段中操纵该值。唯一的另一种选择是使用Session,我不想使用Session,因为如果页面以这种方式刷新,表单将自行重置,这就应该发生。