[英]Binding DataTable To GridView, But No Rows In GridViewRowCollection Despite GridView Population?
問題:我已經在頁面的標記中編碼了GridView。 我在后面的代碼中編碼了一個DataTable,該數據表從一組自定義對象中獲取數據。 然后,我將該數據表綁定到GridView。 (特定問題在下面提到了幾個代碼段。)
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(更重要的是我的cart Session對象)中的數據,而不必執行我在網上看到的所有其他事情,例如利用OnRowUpdate等。有人可以告訴我為什么gvCart.Rows為空和/或不使用OnRowUpdate等如何實現目標? 當我執行此代碼時,將填充GridView,但是由於某些原因,我無法在其后面的代碼中訪問其任何行。
您出錯的原因是因為您正在檢查
if (gvr.Cells[0].Text == prodId)
gvr中有gvCart.Rows,因此您需要先定義行的索引,然后才能引用其Cells。
有一些像:
if (gvr[i].Cells[0].Text == prodId)
您必須定義行的索引號才能單獨識別它。 以下幾行
if (gvr.Cells[0].Text == prodId)
{
uQty = int.Parse(((TextBox)gvr.Cells[4].FindControl("Quantity")).Text);
}
應該是這樣的:
if (gvr[i].Cells[0].Text == prodId)
{
uQty = int.Parse(((TextBox)gvr.Cells[4].FindControl("Quantity")).Text);
}
我復制了代碼,在View方法上提供了Postback上的CartItem對象列表,並且它起作用了-代碼按預期進入了循環。 我所做的唯一更改是注釋掉了我不想打擾圖像的縮略圖b / c。 否則,我會同時保留標記和您的代碼。 您傳遞給View的列表肯定不是空的嗎? 也許如果您能闡明邏輯流程,我可以提供更多信息。 附帶說明一下,為什么要麻煩創建數據集和數據表? 直接將列表綁定到網格會更容易嗎?
因此,當我編寫此項目的代碼時,我剛開始時要喝一大碗FAIL作為早餐,這是一件好事。 我需要在Page_Load()中執行一個DataBind(),否則程序會認為GridView不存在。 問題解決了。 感謝所有嘗試提供幫助的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.