zoukankan      html  css  js  c++  java
  • 关于动态添加TabPanel遇到的问题以及思考

    页面运行初始状态:

        前台页面部分代码段:

        <cc1:TabContainer ID="tabs" runat="server" ActiveTabIndex="0" Height="200px" Width="500px" enableTabScroll="True"  >

                    <cc1:TabPanel runat="server" HeaderText="首页" closable="False" ID="TabPanel1" TabIndex="0">

                        <HeaderTemplate>

                            首页

                        </HeaderTemplate>

                        <ContentTemplate>

                            <iframe src="fdsfsd" frameborder="0" height="200px" width="500px"></iframe>

                        </ContentTemplate>

                    </cc1:TabPanel>

                    <cc1:TabPanel runat="server" HeaderText="我的工作台2" closable="False" ID="TabPanel2" TabIndex="1">

                        <HeaderTemplate>

                           我的工作台2

                        </HeaderTemplate>

                        <ContentTemplate>

                            <iframe src="ggfgdf" frameborder="0" height="200px" width="500px"></iframe>

                        </ContentTemplate>

                    </cc1:TabPanel>

                </cc1:TabContainer>

    首先聊聊关于动态添加TabPanel遇到的问题:

    第一种情况:

    后台代码:

      protected void Page_Load(object sender, EventArgs e)

            {

                TabPanel tab = new TabPanel();

                tab.HeaderText = "NewTab";

                tab.TabIndex = 2;

                tab.ID = "TabPanel3";

                this.tabs.Tabs.Add(tab);

            }

      //“添加”按钮

      protected void LinkButton1_Click(object sender, EventArgs e)

            {

                TabPanel tab = new TabPanel();

                tab.HeaderText = "NewTab";

                tab.TabIndex = 3;

                tab.ID = "TabPanel4";

                this.tabs.Tabs.Add(tab);

            }

    点击“添加”按钮(即实行LinkButton1_Click)报错!

    解决方法:

    将Page_Load中的代码放到Page_Init中,即:

      protected void Page_Init(object sender, EventArgs e)

            {

                TabPanel tab = new TabPanel();

                tab.HeaderText = "NewTab";

                tab.TabIndex = 2;

                tab.ID = "TabPanel3";

                this.tabs.Tabs.Add(tab);

            }

      protected void LinkButton1_Click(object sender, EventArgs e)

            {

                TabPanel tab = new TabPanel();

                tab.HeaderText = "NewTab";

                tab.TabIndex = 3;

                tab.ID = "TabPanel4";

                this.tabs.Tabs.Add(tab);

            }

    这样,第一次点击“添加”按钮的时候就成功了(第二次点击的时候会报前面相同的错误)。原因是:

    Page_Init事件:当页面初始化时运行,例如可以在加载控件之前检测客户端环境变量,它与Load工作方式差不多,但在Load之前运行,当网页重新加载时不会再触发这个事件。(意思就是只有第一次加载页面的时候才会加载页面)。

    运行结果:

    为什么第二次点击“添加”按钮会报错呢,下面改为动态创建(上面都是写死的):

      protected void Page_Load(object sender, EventArgs e)

            {

                if (!IsPostBack)

                {

                    ViewState["TabIndexCount"] = 1;

                }

            }

      protected void LinkButton1_Click(object sender, EventArgs e)

            {

                ViewState["TabIndexCount"] = Convert.ToInt32(ViewState["TabIndexCount"].ToString()) + 1;

                TabPanel tab = new TabPanel();

                tab.HeaderText = "NewTab";

                tab.TabIndex = (short)(Convert.ToInt32(ViewState["TabIndexCount"]));

                tab.ID = "TabPanel" + (Convert.ToInt32(ViewState["TabIndexCount"]) + 1).ToString();

                this.tabs.Tabs.Add(tab);

            }

    第一次点击对的,第二次就报错(上面提到的错误信息图)

    原因可能是:

    服务器端动态创建控件,需要保证每次请求(无论是否回发)都要执行该段代码,否则前一请求创建的就会丢失 ,

    每次页面请求都生成的是一个新页面,由于前一次动态创建的控件无法维护其状态,所以会报错。

    具体解决方案还没有找到,在此也想请教下大家!!!

  • 相关阅读:
    在sql2005中附加数据库时出现无法打开物理文件
    设置和获取文本框中的光标位置
    Dock(停靠)优先小经验
    asp.net(c#)GridView实现鼠标悬停高亮显示
    C# 截取屏幕个人总结
    【作品发布】将硬盘分区为整数的方法
    C# 调用系统“运行”功能
    Linq 在绑定控件后,DataItem的用法
    (一)先配置一些程序 小青年
    ruby中的File操作 小青年
  • 原文地址:https://www.cnblogs.com/EricaMIN1987_IT/p/1932995.html
Copyright © 2011-2022 走看看