c# - 从 GridView 中删除行

标签 c# asp.net gridview

我的页面上有一个 GridView ,我想允许用户向其中添加/删除项目。它是如何工作的,添加功能确实有效,尽管可能不是很好,是用户从下拉列表中选择一个产品,然后单击添加。

这会在网格中创建一个新行,其中包含选择的产品文本和 ID。 GridView 标记是:

                            <asp:GridView runat="server" ID="grdSelectedProducts" BorderWidth="1px" CellPadding="3" CellSpacing="2" AutoGenerateColumns="False" OnRowDataBound="grdSelectedProducts_OnRowDataBound" ShowHeaderWhenEmpty="True" DataKeyNames="ProductId"
                                OnRowCommand="grdSelectedProducts_RowCommand" OnRowDeleted="grdSelectedProducts_RowDeleted" OnRowDeleting="grdSelectedProducts_RowDeleting">
                                <Columns>
                                    <asp:BoundField DataField="Product" HeaderText="Product" ReadOnly="False" />
                                    <asp:TemplateField>
                                        <ItemTemplate>
                                            <asp:LinkButton runat="server" ID="linkDelete" runat="server" CommandName="Delete" CommandArgument="<%# Container.DataItemIndex %>">Remove</asp:LinkButton>
                                        </ItemTemplate>
                                    </asp:TemplateField>
                                    <asp:BoundField DataField="ProductId" HeaderText="ProductId" ReadOnly="False" Visible="False" />
                                </Columns>
                            </asp:GridView>

网格中的数据是绑定(bind)的,但没有连接到数据库,因为它只是下拉列表中的信息。

linkDelete 是我希望允许用户删除项目的地方,所以我的问题是,我怎样才能真正删除该行?我有 RowCommand 事件,我试图将其删除,但它似乎无法正常工作,因为表格要么 1) 以与之前相同的数据反弹,要么 2 ) 由于新 DataTable 的绑定(bind),所有行都被删除。我遗漏了一些明显的东西,但这种类型的网格对我来说是新的。

我在这里或在 Google 上看到的任何示例都围绕着从 SQL 或其他一些数据库进行数据绑定(bind)的 GridView ,这似乎使重新绑定(bind)更容易。但是我的版本没有使用它,所以再次绑定(bind)似乎无法正常工作。

    protected void grdSelectedProducts_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            if (!string.IsNullOrEmpty(e.CommandArgument.ToString()))
            {
                int rowIndex = Convert.ToInt32(e.CommandArgument);
                grdSelectedProducts.DeleteRow(rowIndex);
                CountryDataTable = (DataTable)grdSelectedProducts.DataSource;
                DataTable table = CreateDataTable(false, string.Empty, string.Empty);
                grdSelectedProducts.DataSource = table;
                grdSelectedProducts.DataBind();
            }
        }
    }


    private DataTable CreateDataTable(bool isAddingValue, string selectedProduct, string selectedId)
    {
        // if isAddingValue is FALSE then it isn't from a button click to add a Product, it is just
        // a call to create the datatable

        DataTable dataTable = ProductDataTable;
        if (!dataTable.Columns.Contains("Product"))
        {
            dataTable.Columns.Add("Product");
            dataTable.Columns.Add("ProductId");
        }

        if (isAddingValue)
        {
            // Get the data from ViewState
            DataRow dataRow;
            dataRow = dataTable.NewRow();
            dataRow["Product"] = selectedProduct;
            dataRow["ProductId"] = selectedId;
            dataTable.Rows.Add(dataRow);
        }
        else
        {
            grdSelectedProducts.DataSource = null;
            grdSelectedProducts.DataSource = ProductDataTable;
            grdSelectedProducts.DataBind();
        }

        // Save the data back to ViewState
        ProductDataTable = dataTable;

        return dataTable;
    }

    private DataTable ProductDataTable
    {
        get {return ViewState["ProductDataTable"] as DataTable ?? new DataTable(); }
        set { ViewState["ProductDataTable"] = value; }
    }

我确实有 RowDeletingRowDeleted 事件,但其中没有任何代码。

最佳答案

首先你应该注意的是你是从网格而不是数据表中删除行 然后你再次绑定(bind)可能不会给你任何改变的数据表,你应该做的不是从网格中删除,而是从数据表中删除它

像这样重写

      if (e.CommandName == "Delete")
        {
        if (!string.IsNullOrEmpty(e.CommandArgument.ToString()))
        {
            int rowIndex = Convert.ToInt32(e.CommandArgument);
            DataTable table = CreateDataTable(false, string.Empty, string.Empty);
            table.Rows.RemoveAt(rowIndex) 
            grdSelectedProducts.DataSource = table;
            grdSelectedProducts.DataBind();
        }
    }

如果你需要它从数据库中删除它,不要忘记这样做,还要注意上面的代码每次当你获取表时它都会从数据库中给你所有的东西 所以你可以让它成为全局性的,或者你可以从数据库中删除

关于c# - 从 GridView 中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22530004/

相关文章:

c# - jQgrid 搜索选项未按预期工作

c# - 在 C# 中转换 "div"

c# - 将对象数组作为 TempData[] 传递给查看

c# - 如何检查我的数组中是否有重复值?

c# - 检查c#方法的速度和内存大小

c# - 通过 C# 连接到 MySQL 服务器

c# - 事务(进程 ID 56)在锁定时陷入僵局?

asp.net - GridView无法显示图像

c# - 如何连接两个连接字符串并将数据从一个数据库插入另一个MySQL数据库

java - Android Gridview 带按钮平滑滚动