从GridView中删除行

3

我在我的页面上有一个网格视图,我想允许用户添加/删除其中的项目。它的工作原理是,添加功能可以实现,尽管可能不太好用,用户从下拉列表中选择产品,然后点击“添加”。

这将在网格中创建一个新行,其中包含所选产品的文本和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 事件,并尝试将其删除,但由于绑定新的 DataTable,它似乎不起作用。要么1)表格重新绑定到原来的相同数据,要么2)所有行都被删除。我错过了一些明显的东西,但这种类型的网格对我来说很新。

我在这里或者 Google 上看到的任何一个示例都是围绕着从 SQL 或其他数据库中绑定的 GridView,这似乎使重新绑定更容易。然而,我的版本并没有使用那样的方式,所以重新绑定似乎不能正确工作。

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


1
根据这个链接,DeleteRow 方法将直接从数据源中删除一行。因此不需要重新绑定。我认为... - Bharadwaj
2个回答

4

首先你需要注意的是,你正在从网格中删除行而不是从数据表中删除。然后你又重新绑定了数据表,这可能不会带来任何变化。你应该做的是,不要从网格中删除,而是从数据表中删除。

改写后的内容:

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

如果你需要从数据库中删除它,不要忘记这样做,还要注意上述代码每次在获取表格时都会从数据库中获取所有内容,因此你可以将其设为全局变量,或者只是从数据库中删除它。

1
只需要将“Remove”更改为“RemoveAt”,它就像魔法般地运行了。我简直不敢相信我没有想到从DataTable中删除它...我真是太傻了。 - MattR

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

1
那段代码使用了SQL,正如我在文章中提到的那样,我没有使用数据库连接。 - MattR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接