【发布时间】:2010-06-02 04:00:04
【问题描述】:
问题:我在页面的标记中编写了一个 GridView。我在代码隐藏中编写了一个 DataTable,它从一组自定义对象中获取数据。然后我将该 DataTable 绑定到 GridView。 (具体问题在下面提到了几个code-sn-ps。)
GridView 标记:
<asp:GridView ID="gvCart" runat="server" CssClass="pList" AutoGenerateColumns="false" DataKeyNames="ProductID">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID" />
<asp:BoundField DataField="Name" HeaderText="ProductName" />
<asp:ImageField DataImageUrlField="Thumbnail" HeaderText="Thumbnail"></asp:ImageField>
<asp:BoundField DataField="Unit Price" HeaderText="Unit Price" />
<asp:TemplateField HeaderText="Quantity">
<ItemTemplate>
<asp:TextBox ID="Quantity" runat="server" Text="<%# Bind('Quantity') %>" Width="25px"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Total Price" HeaderText="Total Price" />
</Columns>
</asp:GridView>
DataTable 代码隐藏:
private void View(List<OrderItem> cart)
{
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("Cart");
if (cart != null)
{
dt.Columns.Add("ProductID");
dt.Columns.Add("Name");
dt.Columns.Add("Thumbnail");
dt.Columns.Add("Unit Price");
dt.Columns.Add("Quantity");
dt.Columns.Add("Total Price");
foreach (OrderItem item in cart)
{
DataRow dr = dt.NewRow();
dr["ProductID"] = item.productId.ToString();
dr["Name"] = item.productName;
dr["Thumbnail"] = ResolveUrl(item.productThumbnail);
dr["Unit Price"] = "$" + item.productPrice.ToString();
dr["Quantity"] = item.productQuantity.ToString();
dr["Total Price"] = "$" + (item.productPrice * item.productQuantity).ToString();
dt.Rows.Add(dr);
}
gvCart.DataSource = dt;
gvCart.DataBind();
gvCart.Width = 500;
for (int counter = 0; counter < gvCart.Rows.Count; counter++)
{
gvCart.Rows[counter].Cells.Add(Common.createCell("<a href='cart.aspx?action=update&prodId=" +
gvCart.Rows[counter].Cells[0].Text + "'>Update</a><br /><a href='cart.aspx?action='action=remove&prodId=" +
gvCart.Rows[counter].Cells[0].Text + "/>Remove</a>"));
}
}
}
foreach 下面发生错误 - GridViewRowCollection 为空!
private void Update(string prodId)
{
List<OrderItem> cart = (List<OrderItem>)Session["cart"];
int uQty = 0;
foreach (GridViewRow gvr in gvCart.Rows)
{
if (gvr.RowType == DataControlRowType.DataRow)
{
if (gvr.Cells[0].Text == prodId)
{
uQty = int.Parse(((TextBox)gvr.Cells[4].FindControl("Quantity")).Text);
}
}
}
目标:我基本上是在尝试找到一种方法来更新我的 GridView(更重要的是我的购物车 Session 对象)中的数据,而不必执行我在网上看到的所有其他事情,例如使用 OnRowUpdate 等。有人可以请告诉我为什么 gvCart.Rows 是空的和/或如何在不使用 OnRowUpdate 等的情况下实现我的目标?当我执行此代码时,GridView 会被填充,但由于某种原因,我无法在代码隐藏中访问它的任何行。
【问题讨论】:
标签: c# asp.net gridview datatable