gpt4 book ai didi

c# - 从 GridView 中删除行

转载 作者:行者123 更新时间:2023-12-04 02:07:57 25 4
gpt4 key购买 nike

我的页面上有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com