日期:2014-05-19  浏览次数:20577 次

有关ajax的问题(在updatePanel中动态添加控件的问题)
<form   id= "form1 "   runat= "server ">
        <script     runat= "server ">
          protected   void   Button1_Click(object   sender,   EventArgs   e)
        {
                this.Button2.Text   =   "我被改变了 ";


                Button   btn   =   new   Button();
                btn.Text   =   "新的按钮 ";
                btn.ID   =   "acb ";
                this.UpdatePanel2.ContentTemplateContainer.Controls.Add(btn);
        }
       
        </script>
        <div>
                <asp:ScriptManager   ID= "ScriptManager1 "   runat= "server ">
                </asp:ScriptManager>
                <asp:UpdatePanel   ID= "UpdatePanel1 "   runat= "server ">
                        <ContentTemplate>
                                <asp:Button   ID= "Button1 "   runat= "server "   OnClick= "Button1_Click "   Text= "btn1 "   />
                        </ContentTemplate>
                </asp:UpdatePanel>
                <asp:UpdatePanel   ID= "UpdatePanel2 "   runat= "server ">
                        <ContentTemplate>
                                <asp:Button   ID= "Button2 "   runat= "server "   Text= "btn2 "   />
                        </ContentTemplate>
                </asp:UpdatePanel>
        </div>
        </form>

为什么 我点了一百次Button1,都只出来一个---- "新的按钮 ";
为什么为什么??????????????????

------解决方案--------------------
问题不在ID上
楼主要学习下生存期的问题。
动态添加的控件 页面生成结束就丢失了
需要你自己保存并维护控件状态
(动态生成的控件依然可以有自己的VIEWSTATE)

一般来说动态加载的功能模块都有一个自己的SETUP或者START方法,进行初试设置,或者把上次自己的状态加回来。

举例说明在页面的 OnInit中 根据自己存在SESSION中的一个变量标记把需要的控件生成。并调用他的启动函数把数据给它,保存它的一些关键数据 为了下次生成。 如果在POSTBACK的时候用户要加东西, 那就再生成一个东西 ADD进该去的容器。

简单来说 每次回传都要把前边已经存在 并没有删掉的东西加载一遍。

其实上边说加载过程在OnInit 不是必须, 只是有些东西可能需要在这一步执行,在PAGELOAD也可以,只要保证不出特殊问题。 (比如WEBPART应用在页上,这时候位置可能是变动的,在PAGELOAD时候加 就会有问题。)