【问题标题】:Editing a gridview with AutoGenerateEditButton = true使用 AutoGenerateEditButton = true 编辑网格视图
【发布时间】:2013-08-26 17:53:55
【问题描述】:

我动态创建了一个 gridview 并添加了 AutoGenerateEditButton = true;属性,我看到它在将表格加载到gridview时将编辑链接添加到所有字段。但是当我单击编辑按钮时,除了回发之外,什么也没有发生。我做错了什么?

        GridView gridData = new GridView();
        gridData.ID = "test";
        gridData.AutoGenerateEditButton = true;
        gridData.RowEditing += (sender, e) => grid_RowEditing(tbl, e, sender);
        gridData.DataSource = tbl;
        gridData.DataBind();

 protected void grid_RowEditing(DataTable tbl, GridViewEditEventArgs e, object sender)
    {
        ((GridView)sender).EditIndex = e.NewEditIndex;
        // call your databinding method here
        ((GridView)sender).DataSource = tbl ;
        ((GridView)sender).DataBind();
    }

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    我的猜测是,因为您通过重新创建每个回发来覆盖网格,所以点击会被忽略。

    建议的方法是静态创建不可见的网格:

    <asp:GridView .... Visible="false" />
    

    然后在需要时让它可见。这种方法(与动态创建相反)可以让您避免许多问题,很可能包括您面临的问题。

    编辑:如果您真的非常想遵循您的路线,那么我的猜测是您只是没有指定您的数据键名称,因此编辑点击不会携带点击行的任何信息。

    gridData.DataKeyNames = new string[] { "ID" };
    

    (如果你的主键列名是ID

    【讨论】:

    • 你绝对正确,下次如果我从头开始创建这个我会的,但现在很难做到,因为他们有一个占位符并创建网格视图然后放置它在占位符中
    • 好主意,但是当我添加它时,它说它无法将类型字符串转换为类型字符串[]
    • 我在想也许我可以做一个弹出窗口之类的事情,然后从那里编辑 gridview,任何关于如何做类似事情的好资源
    • 修复了这个问题。再次查看答案。
    • 我刚刚添加了,但我不知道为什么它一直在做回发
    【解决方案2】:

    我在客户端添加了a &lt;p id="p" runat="server"&gt;,并在此控件中添加了该网格。 这是我的代码。 我使用 SqlDataSource 而不是 Datatable,你可以使用它的任何一个。 希望它对你有用..

        protected void gridview()
        {               
            GridView gridData = new GridView();
            gridData.ID = "test";
            gridData.AutoGenerateEditButton = true;
    
            gridData.RowEditing += (sender, e) => grid_RowEditing(SqlDataSource1, e, sender);
            gridData.DataSource = SqlDataSource1;
            gridData.DataBind();
            p.Controls.Add(gridData);
        }
    
        protected void grid_RowEditing(SqlDataSource tbl, GridViewEditEventArgs e, object sender)
        {
            ((GridView)sender).EditIndex = e.NewEditIndex;
            // call your databinding method here
            ((GridView)sender).DataSource = tbl;
            ((GridView)sender).DataBind();
        }
    

    2) 我也尝试过datatable,它的工作原理。 这是我的代码。

        protected void gridview()
        {
    
            DataTable dt = new DataTable();            
            dt.Columns.Add("id");
            dt.Columns.Add("name");         
            for (int i = 0; i < 100; i++)
            {               
                dt.Rows.Add(i.ToString(),"v"+i.ToString());
            }
    
            GridView gridData = new GridView();
            gridData.ID = "test";
            gridData.AutoGenerateEditButton = true;
            gridData.RowEditing += (sender, e) => grid_RowEditing(dt, e, sender);
            gridData.DataSource = dt;
            gridData.DataBind();
            p.Controls.Add(gridData);
        }
    
        protected void grid_RowEditing(DataTable tbl, GridViewEditEventArgs e, object sender)
        {
            ((GridView)sender).EditIndex = e.NewEditIndex;
            // call your databinding method here
            ((GridView)sender).DataSource = tbl;
            ((GridView)sender).DataBind();
        }
    

    【讨论】:

    • SqlDataSource 是一个可编辑的数据源。不幸的是,他使用的是DataTable。这就是为什么他必须手动处理RowEditing 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多