C#动态生成控件以及添加事件处理
2009-04-01 08:21:45 来源:WEB开发网这几天忙,好久没上来了,今天项目基本完了,可以轻松下了。明天周末,呵呵。
我项目中遇到的是动态创建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")
更多精彩
赞助商链接