2

我正在使用ASP.NET/C#.

在我的一个页面中,我正在使用.InsideUpdate PanelUpdate Panel有一个在.LinkButtonTextboxUpdate Panel

是动态创建的Textboxes,它工作正常。但是,当我click同样Linkbutton添加 nextTextbox时,我以前的值Textbox丢失了。

我认为这是因为PostBack.

这是我的创建代码Textboxes

protected void linkAddAmount_Click(object sender, EventArgs e)
        {
            int count = 0;

            if (ViewState["ButtonCount"] != null)
            {
                count = (int)ViewState["ButtonCount"];
            }

            count++;
            ViewState["ButtonCount"] = count;

            for (int i = 0; i < count; i++)
            {
                AmountUpdatePanel.ContentTemplateContainer.Controls.Add(new LiteralControl("<span>From:&nbsp;</span>"));
                TextBox textbox1 = new TextBox();
                textbox1.ID = "txtAmountFrom" + i;
                textbox1.Attributes.Add("class", "ShortTextbox");
                AmountUpdatePanel.ContentTemplateContainer.Controls.Add(textbox1);
            }
        }

谁能帮我解决这个问题?

欢迎任何建议。

4

3 回答 3

3

也许这篇 MSDN 文章解释了为什么会发生这种情况:Dynamic Web Server Controls and View State

您将在这篇较早的文章中找到一个很好的解释:动态 Web 控件、回发和视图状态

如果动态控件是在每个页面请求上创建的,它们将从上一个请求中获取 ViewState 值,因此可能会在加载时创建控件,隐藏它们并在用户执行某些操作时显示它们。

此外,如果您在设计时创建了具有这种在回发后丢失值的行为的控件,请检查您是否没有在某处将其 EnableViewState 属性设置为false 。

你应该沿着它的Id设置控件的名称。该名称用于表单提交。当您有一个具有不同 ID 和相同名称的单选按钮列表时,这一点最为明显。提交后,将发送一对以单选按钮的名称为键、选定单选按钮的 id 作为值的对。

于 2012-08-07T08:54:54.960 回答
1

在 Postback 上,可以调用这些类型的代码来重新获得 Textbox 的值。

txtPartName.Text = Request.Form[txtPartName.UniqueID];

对于第一次加载,我们可以在设置值之前在代码下方,如上一行所述。如果这些值是第一次从 DB 或外部绑定,这些行可能会有所帮助。

if (!string.IsNullOrEmpty(Request.Form[txtPartName.UniqueID]))
于 2013-11-15T15:28:24.950 回答
0

可以在 Stack 上找到有关在更新面板中使用动态控件的信息:

在 UpdatePanel 中动态创建控件?

您是否通过以下方式实现了 flem 的答案?

protected void linkAddAmount_Click(object sender, EventArgs e)
        {
            int count = 0;

            if (ViewState["ButtonCount"] != null)
            {
                count = (int)ViewState["ButtonCount"];
            }

            count++;
            ViewState["ButtonCount"] = count;

            for (int i = 0; i < count; i++)
            {
                AmountUpdatePanel.ContentTemplateContainer.Controls.Add(new LiteralControl("<span>From:&nbsp;</span>"));
                TextBox textbox1 = new TextBox();
                textbox1.ID = "txtAmountFrom" + i;
                textbox1.Attributes.Add("class", "ShortTextbox");

            if (!string.IsNullOrEmpty(Request.Form["txtAmountFrom" + i.ToString()]))
                {
              textbox1.Text = Request.Form["txtAmountFrom" + i.ToString()];
                }

                AmountUpdatePanel.ContentTemplateContainer.Controls.Add(textbox1);
            }
        }
于 2012-08-07T07:59:43.877 回答