這幾天忙,好久沒上來了,今天項目基本完了,可以輕松下了。明天周末,呵呵。
我項目中遇到的是動態創建Tab選項卡和GridvIEw,按下面的方法可以,創建它們當然在page_load裡了,有時,它會引起你頁面上其它的按鈕用不了,這時,你可以把它們不放在page_load裡,而放在page_init裡,這樣就不會有問題了,我不知其它的AJax控件會不會有這樣的問題,我創建TabPanel時,就出現異常。我把它們放在Page_Init裡就不會這樣了。
動態添加AJaxControl Toolkit的Tab控件及設置模板
有朋友在使用AJaxControl Toolkit裡的Tab控件,他剛剛問怎麼實現在cs裡動態添加TabPanel項。我建了一個項目試了一下。主要問題是TabPanel裡如何創建ContentTemplate。
<AJaxToolkit:TabContainer>控件使用方法比較簡單,直接拖到頁面上,添加TabPanel,然後直接輸入TabPanel的內容就可以了,控件完全支持設計時的WYSIWYG,非常方便。TabPanel裡的內容是通過<contenttemplate></contenttemplate>來指定的。這個對應於TabPanel的ContentTemplate屬性,VS裡intellisense顯示它的類型是ITemplate,這是一個接口,我試著在intellisense裡找找有沒有類實現了這個接口,但一無所獲。找不到這個類,就沒有辦法給ContentTemplate賦值。於是查看了一下Tab控件的源碼,又查閱了MSDN,終於把問題解決了。
問題關鍵就在於這個實現了ITemplate接口的類,我找不到,只好自己寫了一個。也不知道有沒有別的方法,希望有知道的朋友告訴我。全部代碼如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using AJaxControlToolkit; //記得加上這個啊
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
TabContainer tabContainer1 = new TabContainer();
TabPanel tab1 = new TabPanel();
tab1.HeaderText = "標簽1";
tabContainer1.Tabs.Add(tab1);
TabPanel tab2 = new TabPanel();
tab2.HeaderText = "標簽2";
tabContainer1.Tabs.Add(tab2);
//建立第一個Tab裡的內容
Panel panel1 = new Panel();
Label label1 = new Label();
label1.Text = "這是第一個Tab";
panel1.Controls.Add(label1);
//創建一個Template
TabContentTemplate temp1 = new TabContentTemplate();
//添加子控件
temp1.SetTemplate(panel1);
tab1.ContentTemplate = temp1;
this.form1.Controls.Add(tabContainer1);
}
}
public class TabContentTemplate : ITemplate
{
private Control _template;
public void SetTemplate(Control templateControl)
{
_template = templateControl;
}
ITemplate Members#region ITemplate Members
public void InstantiateIn(Control container)
{
container.Controls.Add(_template);
}
#endregion
}
很多控件,如GridVIEw、Repeat等都使用了Template,應該也都可以按這種方法來實現動態設置模板了。
BTW,另外還有一種方法動態設置模板,就是使用Page.LoadTemplate("template.ascx"),如tab1.ContentTemplate=Page.LoadTemplate("template.ascx")