ASP.NET - 添加到控件集合的新用户控件意外获得一个值

时间:2009-07-25 19:26:45

标签: asp.net

我创建了用户控件容器(实际上是面板),它动态地添加和删除用户控件项(如行)。这是问题所在:当新的用户控件添加到控件集合时,意外地从前一个添加的控件获取一个值 - 仅在第一个回发后。

详细说明:

  1. 在初始响应中,我填写了一个用户控件项。
  2. 然后我点击“添加”按钮,它将新的用户控制项添加到面板,这个NEW控件从前一个获取值(更令人困惑的是新控件没有获得所有值,只是形成了禁用textBox控件和dropDownLists)。为什么?当在面板控件集合中添加时,UC在服务器上获得价值。
  3. 所以我对这个问题的实现是:

                UcSomeControlItem uci = LoadControl("UcSomeControlItem .ascx") as UcSomeControlItem;
                uci.DataSource = new SomeObject;
                uci.DataBind();
                uci.ID = IdPrefix + ControlID;
                ph1.Controls.Add(uci);//At the end
    

    当我更改添加到面板控件集合序列问题消失时,科学家们在面板添加值得到了...

    像:

                UcSomeControlItem uci = LoadControl("UcSomeControlItem .ascx") as UcSomeControlItem;
                ph1.Controls.Add(uci);//Firstly adding ..
                uci.DataSource = new SomeObject;
                uci.DataBind();
                uci.ID = IdPrefix + ControlID;
    

    所以我想确切地知道发生了什么?谁将值设置为新添加的创建控件?

1 个答案:

答案 0 :(得分:2)

当容器已经在页面上时,只要向其容器添加控件,就会为新添加的控件按顺序触发所有生命周期事件(Init,LoadViewState,Load等等),直到它捕获为止直到父控件当前生命周期的位置。

因为你设置了控件的ID而然后将它添加到页面中,所以当触发所有追赶事件时,它具有与之前控件相同的ID。因此,当为控件触发LoadPostbackData时(在加载ViewState之后发生),ASP.Net假设它与之前的控制相同,只是因为ID匹配,并继续将先前的值加载到控件中。

当你更改它以便在之后分配ID 时,你将控件添加到页面中,当控件只有一个自动生成的ID时会触发所有生命周期事件,所以回发处理器不承认它是以前存在的控制。

希望这很清楚。