Связывание DataTable с GridView, но без строк в GridViewRowCollection, несмотря на заполнение GridView? - PullRequest
1 голос
/ 02 июня 2010

Проблема: я написал GridView в разметке на странице. Я кодировал DataTable в коде позади, который берет данные из коллекции пользовательских объектов. Затем я связываю этот 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 Code-Behind:

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 заполняется, но по какой-то причине я не могу получить доступ ни к одной из его строк в коде позади.

Ответы [ 4 ]

0 голосов
/ 03 июня 2010

Так что, когда я кодировал этот проект, хорошо, что я начал свой выходной день с большой чаши FAIL на завтрак. Мне нужно было сделать DataBind () в Page_Load (), иначе программа подумала бы, что GridView там нет. Задача решена. Спасибо всем, кто пытался помочь.

0 голосов
/ 02 июня 2010

Вы должны определить номер индекса строки, чтобы идентифицировать его индивидуально. Следующие строки

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);
 }
0 голосов
/ 02 июня 2010

Я скопировал ваш код, снабдил метод View списком объектов CartItem в Postback, и он заработал - код вошел в цикл, как и ожидалось. Единственное изменение, которое я сделал, - закомментируйте миниатюру, которую я не хотел беспокоить изображением. В противном случае я сохранил как разметку, так и ваш код. Список, который вы передаете в View, определенно не пуст? Возможно, если бы вы могли прояснить логику потока, я мог бы предложить что-то большее. В качестве примечания, почему вы беспокоитесь о создании набора данных и данных? Не проще ли просто привязать список к сетке напрямую?

0 голосов
/ 02 июня 2010

Причина вашей ошибки в том, что вы проверяете

if (gvr.Cells[0].Text == prodId)

gvr есть gvCart.Rows, поэтому вам нужно определить индекс строки, прежде чем вы сможете ссылаться на ее ячейки.

Вроде как:

* +1007 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...