【问题标题】:programmatically adding user controls以编程方式添加用户控件
【发布时间】:2014-02-19 13:49:54
【问题描述】:

我有一个 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 方法时才存在,那么我该如何克服呢?

【问题讨论】:

  • 使用与以前相同的 ID 在 Page_InitPage_Load(最迟)中重新创建它们。因此,您需要保留已创建控件的数量,例如在ViewState 中。 4guysfromrolla.com/articles/092904-1.aspx
  • 此链接可以帮助stackoverflow.com/questions/682269/… ,在这种情况下,您必须维护创建或未创建的用户控件的状态......才能在页面加载时重新加载它。这只是一个想法

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


【解决方案1】:

在 WebForms 上处理动态创建的控件很复杂。所以第一个建议是在不使用动态添加的控件的情况下解决问题,例如带有中继器或可见/不可见控件(不是很漂亮,但稳定)。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2011-12-15
    • 2012-08-15
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多