C# 存储用于回发的动态插入控件数

C# 存储用于回发的动态插入控件数,c#,.net,user-controls,webforms,dynamic-usercontrols,C#,.net,User Controls,Webforms,Dynamic Usercontrols,我需要创建以下功能,并寻找在多个回发上存储信息的最佳方式: 假设我有一个与问题相关的文本框,即“我去过的地方”。一旦文本框在第一次加载时加载。在那下面,有一个按钮“添加另一个地方”。这将回发,然后在第一个文本框下面添加另一个文本框。这可以执行x次 我的问题是,考虑到此加载需要在Init事件中完成,并且此时未加载ViewState,如何存储/记住用户添加到页面中的控件数 编辑*: 我忘了提到,当用户保存时,会进行一些验证,因此如果验证失败,则需要显示所有文本框及其发布的数据。如果要在表单上只允许有

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

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

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

编辑*:


我忘了提到,当用户保存时,会进行一些验证,因此如果验证失败,则需要显示所有文本框及其发布的数据。

如果要在表单上只允许有限数量的文本框,您可以在Page_Init期间创建该数量的文本框,并将其可见性设置为false,以便它们不会在浏览器中呈现。在按钮的click事件中,您可以找到第一个不可见的文本框,并将可见性更改为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;
}
受保护的无效页\u Init(对象发送方,事件参数e)
{
对于(int i=0;i<20;i++)
{
this.Form.Controls.Add(new TextBox(){Visible=false});
}
}
受保护的无效addTextboxButton_单击(对象发送者,事件参数e)
{
TextBox tb=this.Form.Controls.OfType().FirstOrDefault(box=>box.Visible==false);
如果(tb!=null)tb.Visible=true;
}
使用这种方法,每次单击按钮时,文本框都会一个接一个地显示出来,回发值会保持不变


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

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

选项2:您甚至可以在页面的加载事件中添加控件,其中包含ViewState信息

以下是可以帮助您的链接


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

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

protected override void OnInit(事件参数e)
{
int i=0;
i=Int32.Parse(hdnTestCount.Value);
if(Request.Params[hdnTestCount.UniqueID]!=null)
{
i=Int32.Parse(Request.Params[hdnTestCount.UnitueID]);
}

对于(int j=1;j您是否将访问的位置数限制为仅20个。@国王,关键是选择一个限制,然后在初始化期间创建文本框。对于示例,20只是一个任意数字。请使用任意值。您可能还希望向其他文本框添加唯一和连续的ID,以便可以识别它们并根据导致它们添加到表单中的事件进行处理。如果我在加载事件中加载控件,如果我回发和验证失败,这些控件中不会包含值,因为加载在生命周期中太晚了,对吗?
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();
}