我创建了用户控件容器(实际上是面板),它动态地添加和删除用户控件项(如行)。这是问题所在:当新的用户控件添加到控件集合时,意外地从前一个添加的控件获取一个值 - 仅在第一个回发后。
详细说明:
所以我对这个问题的实现是:
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;
所以我想确切地知道发生了什么?谁将值设置为新添加的创建控件?
答案 0 :(得分:2)
当容器已经在页面上时,只要向其容器添加控件,就会为新添加的控件按顺序触发所有生命周期事件(Init,LoadViewState,Load等等),直到它捕获为止直到父控件当前生命周期的位置。
因为你设置了控件的ID而然后将它添加到页面中,所以当触发所有追赶事件时,它具有与之前控件相同的ID。因此,当为控件触发LoadPostbackData时(在加载ViewState之后发生),ASP.Net假设它与之前的控制相同,只是因为ID匹配,并继续将先前的值加载到控件中。
当你更改它以便在之后分配ID 时,你将控件添加到页面中,当控件只有一个自动生成的ID时会触发所有生命周期事件,所以回发处理器不承认它是以前存在的控制。
希望这很清楚。