【问题标题】:Remove Row from GridView从 GridView 中删除行
【发布时间】:2025-11-25 23:10:01
【问题描述】:

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

这会在网格中创建一个新行,其中包含选择的产品文本和 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>

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

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

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

    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 事件,但我没有任何代码。

【问题讨论】:

标签: c# asp.net gridview


【解决方案1】:

您应该注意的第一件事是从网格中删除行而不是从数据表中 然后你再次绑定可能不会给你任何改变的数据表,你应该做的不是从网格中删除,而是从数据表中删除它

像这样改写

      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();
        }
    }

如果您需要将其从 DB 中删除,请不要忘记这样做,并且还要注意,每次您获取表时,上面的代码都会为您提供 DB 中的所有内容 所以你可以让它成为全局的,或者你可以从数据库中删除

【讨论】:

  • 它只需要将 Remove 更改为 RemoveAt,它就像一个魅力。不敢相信我没想过从 DataTable 中删除它……我真傻。
【解决方案2】:

试试这个代码

if (e.CommandName == "Delete")
    {
        if (!string.IsNullOrEmpty(e.CommandArgument.ToString()))
        {
            int rowIndex = Convert.ToInt32(e.CommandArgument);
            grdSelectedProducts.DeleteRow(rowIndex);
            SqlCommand cmd = new SqlCommand ("Delete from table where id='"+ rowIndex )+"'",ConnectionObject);
            cmd.ExecutenonQuery();
            CountryDataTable = (DataTable)grdSelectedProducts.DataSource;
            DataTable table = CreateDataTable(false, string.Empty, string.Empty);
            grdSelectedProducts.DataSource = table;
            grdSelectedProducts.DataBind();
        }
    }

【讨论】:

  • 该代码使用 SQL,正如我在帖子中提到的,我没有使用数据库连接。