【发布时间】: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; }
}
我确实有 RowDeleting 和 RowDeleted 事件,但我没有任何代码。
【问题讨论】:
-
msdn.microsoft.com/en-us/library/… 据此,
DeleteRow将直接从数据源中删除一行。所以不用再重新绑定了。我认为...