代码之家  ›  专栏  ›  技术社区  ›  Peter Stegnar

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

  •  0
  • Peter Stegnar  · 技术社区  · 17 年前

    我已经创建了用户控制容器(实际上是面板),它动态地添加和删除用户控制项(如行)。问题在于:将新的用户控件添加到控件集合时,会意外地从上一个添加的控件中获取值-仅在返回的第一个日志上。

    详细说明:

    1. 在初始响应中,我填充了一个用户控制项。
    2. 然后我单击“添加”按钮,将新的用户控件项添加到面板中,这个新控件从上一个控件中获取值(更令人困惑的是,新控件不获取所有值,只从禁用的文本框控件和DropDownList中获取)。为什么?当添加到面板控件集合中时,UC在服务器上获取值。

    所以我对这个问题的实现是:

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

    当我改变了添加到面板控制集合序列的问题dissapear时,sience the uc获取面板上的值adding…

    像:

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

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

    1 回复  |  直到 17 年前
        1
  •  2
  •   womp    17 年前

    当容器已经在页面上时,只要向其容器中添加控件,所有生命周期事件(init、loadviewstate、load等)都会为新添加的控件顺序激发,直到它赶上父控件当前的生命周期。

    因为你设置了控件的ID 然后 将它添加到页面中,当触发所有追赶事件时,它与某些以前的控件具有相同的ID。因此,当为控件激发loadpostbackdata(在加载viewstate后立即发生)时,ASP.NET假定它与以前的控件相同,只是因为ID匹配,并继续将以前的值加载到控件中。

    当您更改它以便分配ID时 之后 您将控件添加到了页面中,当控件只有一个自动生成的ID时,将激发所有生命周期事件,因此回发处理器不会将其识别为以前存在的控件。

    希望这是清楚的。

    推荐文章