页面运行初始状态:
前台页面部分代码段:
<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);
}
第一次点击对的,第二次就报错(上面提到的错误信息图)
原因可能是:
服务器端动态创建控件,需要保证每次请求(无论是否回发)都要执行该段代码,否则前一请求创建的就会丢失 ,
每次页面请求都生成的是一个新页面,由于前一次动态创建的控件无法维护其状态,所以会报错。
具体解决方案还没有找到,在此也想请教下大家!!!