以编程方式添加用户控件

时间:2014-02-19 13:49:54

标签: c# asp.net postback code-behind autopostback

我有一个asp.net网站和一个用户控件添加到页面。 然后我还有一个按钮,一旦点击就会向页面添加第二个用户控件。

protected void btnAdd_Click(object sender, EventArgs e)
        {
            Metric newControl = (Metric)LoadControl("~/Metric.ascx");
            Random rnd = new Random();
            newControl.ID = "id" + rnd.Next();
            placeholder.Controls.Add(newControl);
        }

问题是每个用户控件都有一个下拉列表会导致回发,所以当发生这种情况时,添加了btnAdd按钮的用户控件就不再存在了。

我理解这是因为它仅在调用btnAdd_Click方法时存在,所以我该如何克服它?

1 个答案:

答案 0 :(得分:0)

在WebForms上处理动态创建的控件很复杂。因此,第一个建议是在不使用动态添加的控件的情况下解决问题,例如:使用Repeater或Visible / Invisible控件(不是很漂亮但稳定)。

如果无法做到这一点,则需要在页面生命周期的早期重新创建动态添加的控件(例如,在Page_Init中),以便可靠地连接事件。因此,您需要更改分配UserControls ID的方式,因为您需要一种确定性方法来为您重新创建的控件分配相同的ID。你可以使用像Metric1,Metric2,......这样的ID('PlaceHolder.Controls`的最后一个计数是你指定的数字)。为了能够访问已添加的控件数量,您需要存储它以便可以在Page_Init中访问它,例如在您放置在页面上的隐藏字段中。

然后,您需要添加代码以重新创建Page_Init中的控件。因此,您需要知道页面上已放置了多少控件。您可以从请求的Form-collection中检索它,然后重新创建控件。

有关如何处理动态控件的详细概述,请参阅此link