簡體   English   中英

將數據表綁定到GridView,但是盡管GridView填充,但GridViewRowCollection中沒有行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM