none
请教gridview里动态生成模板列,页面回传后消失的问题 RRS feed

  • 问题

  • 在gridview里动态生成模板列后,页面打开里,模板列都显示出来了,可随便点击一个按钮,页面回传后,模板列就消失了,该怎么办呢?
    我是在onInit事件中生成的,如下
     protected override void OnInit(EventArgs e)
        {
             //省略生成其它绑定列的代码

            TemplateField operation = new TemplateField();
            operation.HeaderTemplate = new GridViewTemplete(DataControlRowType.Header, "操作");
            operation.ItemTemplate = new GridViewTemplete(DataControlRowType.DataRow, "");
            GridView1.Columns.Add(operation);       
            base.OnInit(e);
        }

    模板列的类使用了网上的代码:如下
    public class GridViewTemplete : ITemplate
    {
        private DataControlRowType templeteType;
        private string columnName;
        public GridViewTemplete(DataControlRowType type, string colname)
        {
            templeteType = type;
            columnName = colname;
        }
        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templeteType)
            {
                case DataControlRowType.Header:
                    Literal lc = new Literal();
                    lc.Text = columnName;
                    container.Controls.Add(lc);
                    break;
                case DataControlRowType.DataRow:
                    LinkButton del = new LinkButton();
                    del.ID = "btndel";
                    del.Text = "删除";
                    del.CommandName = "del";
                    container.Controls.Add(del);

                    Literal lt = new Literal();
                    lt.Text = " ";
                    container.Controls.Add(lt);

                    LinkButton edit = new LinkButton();
                    edit.ID = "btnedit";
                    edit.Text = "修改";
                    edit.CommandName = "edt";
                    container.Controls.Add(edit);
                    break;
                default:
                    break;
            }
        }
    }

    2009年4月28日 7:39

答案

  • 哦,对了,我把该gridview数据源的绑定写在了Page_Load里了,没有写在生成模板列的代码下面
    谢谢

    这不是模板列小时的原因  

    模板列的生成  在第二次post到页面的时候没有运行  也就是说  第二次没有激发  init 事件
    似乎需要每次都运行才能保持
    工作突然有点忙 嘿嘿
    • 已标记为答案 袁源 2009年4月29日 1:55
    2009年4月28日 7:54

全部回复

  • 修改成直接在构造函数加看看
    工作突然有点忙 嘿嘿
    2009年4月28日 7:45
  • 哦,对了,我把该gridview数据源的绑定写在了Page_Load里了,没有写在生成模板列的代码下面
    谢谢
    2009年4月28日 7:46
  • 哦,对了,我把该gridview数据源的绑定写在了Page_Load里了,没有写在生成模板列的代码下面
    谢谢

    这不是模板列小时的原因  

    模板列的生成  在第二次post到页面的时候没有运行  也就是说  第二次没有激发  init 事件
    似乎需要每次都运行才能保持
    工作突然有点忙 嘿嘿
    • 已标记为答案 袁源 2009年4月29日 1:55
    2009年4月28日 7:54
  • 是的,感觉是这样。但不知有没有好办法,我这个页面是用的动态生成的表格,所以需要用模板列来显示数据。
    所以遇到了上述问题,在网上也没找个好点的例子。
    另外,发现,如果把数据源的绑定和生成模板列放在一起,就会导致点击操作按钮时,每次都需要点两次

    2009年4月28日 8:01
  • 修改成直接在构造函数加看看 因为构造函数不大可能不触发
    工作突然有点忙 嘿嘿
    2009年4月28日 9:32
  • 哦,多谢了,我还是放在了OnInit里了,从头写了这个页面,好像问题可以解决
    2009年4月29日 1:54
  • 那太好了~~恭喜


    工作突然有点忙 嘿嘿
    2009年4月29日 5:29
  • 导致问题的真正原因终于查出来了,现给我的错误报告给大家,谢谢各位,谢谢韦恩,呵呵,
    如下代码所示:
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataRowView row = (DataRowView)e.Row.DataItem;
                LinkButton del = (LinkButton)e.Row.FindControl("btndel");
                if (del != null)
                {
                    del.CommandArgument = row["ID"].ToString();
                    //e.Row.ID = row["ID"].ToString();//以前有这一句,才导致出现了删除按钮需要双击,字段绑定等以上问题
                    del.Click += new EventHandler(Operate_Click);
                    del.Attributes.Add("onclick", "return confirm('确定要删除吗?');");
                }
             }
        } 
    2009年4月29日 5:37