从GridView中删除行

时间:2014-03-20 10:26:50

标签: c# asp.net 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>

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

linkDelete是我想让用户删除某个项目的地方,所以我的问题是,我该如何删除该行?我已经尝试删除了RowCommand事件,但它似乎无法正常工作,因为表1)以与之前相同的数据获得反弹或2)所有行由于新DataTable的绑定而被删除。我错过了一些明显的东西,但这种类型的网格对我来说是新的。

我在这里或在Google上看到的任何一个例子都是关于gridviews的数据视图,这些数据库来自SQL或其他一些数据库,这似乎使重新绑定变得更容易。但是我的版本没有使用,所以再次绑定似乎无法正常工作。

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

我确实有RowDeleting&amp; RowDeleted个事件,但我没有任何代码。

2 个答案:

答案 0 :(得分:3)

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

重写它像

      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中删除它,Dont忘记这样做了,并且还注意上面的代码每次当你获取表时它会给你所有来自DB的东西 所以你可以把它变成全局的,或者你可以从DB中删除

答案 1 :(得分: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();
        }
    }