声明式数据绑定中介绍了 GridView 的模板,但这种模板都是在 .aspx 中定义好了的,如何利用程序动态制定模板呢?
其实不复杂,首先要创建一个字段类。
public class MyTemplate : System.Web.UI.ITemplate
{
public MyTemplate()
{
}
public void InstantiateIn(System.Web.UI.Control container)
{
System.Web.UI.LiteralControl lc = new System.Web.UI.LiteralControl();
lc.DataBinding += new EventHandler(Item_DataBinding);
container.Controls.Add(lc);
}
private void Item_DataBinding(object sender, System.EventArgs e)
{
System.Web.UI.LiteralControl lc = (System.Web.UI.LiteralControl)sender;
System.Web.UI.WebControls.GridViewRow gvr = (System.Web.UI.WebControls.GridViewRow)lc.NamingContainer;
lc.Text = Convert.ToString(System.Web.UI.DataBinder.Eval(gvr.DataItem, "CategoryName"));
}
}
然后,动态添加模板。
System.Web.UI.WebControls.TemplateField tf = new System.Web.UI.WebControls.TemplateField();
tf.ItemTemplate = new MyTemplate();
GridView1.Columns.Add(tf);
//GridView1.Columns.Insert(0, tf);
问题
那不是每个字段都要建立一个类?不嫌麻烦吗?
其实不必,我们可以改变 MyTemplate 的构造函数,传入我们想要的参数,实现我们想要的功能。
TemplateField 和 TemplateColumn 有什么区别?
TemplateField 适用于 GridView 和 DetailsView,而 TemplateColumn 仅适用 DataGrid。
除了 TemplateField,其他字段的名字是什么?比如命令字段。
BoundField、ButtonField、CheckBoxField、CommandField、HyperLinkField、ImageField、TemplateField 等。
我想动态添加一个按钮列,支持事件吗?
要让程序响应这个按钮事件,我还没找到方法,因为 InstantiateIn 是在 GridView 的 DataBind 之后执行的,我曾试图在外面建立一个按钮并设置好事件,然后通过 MyTemplate 构造函数,传进去,结果仍然不行。我在网上找了很多资料,都没找到解决方案。有两篇说他成功了,但说很模糊,并且我照他说的做,却没成功。
相关阅读