我在我的页面上有一个网格视图,我想允许用户添加/删除其中的项目。它的工作原理是,添加功能可以实现,尽管可能不太好用,用户从下拉列表中选择产品,然后点击“添加”。
这将在网格中创建一个新行,其中包含所选产品的文本和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; }
}
我有RowDeleting
和RowDeleted
事件,但是我这里没有任何代码。
DeleteRow
方法将直接从数据源中删除一行。因此不需要重新绑定。我认为... - Bharadwaj