动态添加 GridView 的模板列

作者:vkvi 来源:ITPOW(原创) 日期:2009-12-15

声明式数据绑定中介绍了 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 构造函数,传进去,结果仍然不行。我在网上找了很多资料,都没找到解决方案。有两篇说他成功了,但说很模糊,并且我照他说的做,却没成功。

相关阅读

相关文章