Member 13300069 Ответов: 1

У меня возникли проблемы с моим VB-кодом для обновления корзины покупок сеанса . Может ли кто - нибудь помочь мне с моим кодом?


Я привязал корзину к GridView и хочу обновить столбец количества определенной строки. Кажется, у меня возникли проблемы с обновлением текстового поля. Я помещаю новое значение в текстовое поле и нажимаю ссылку Обновить, но оно не обновляется. Мои страницы заказов работают в том смысле, что товар помещается в корзину сеанса. Это страница корзины, с которой у меня возникли проблемы.

Корзину ГВ:
 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID"
                  GridLines="Horizontal"  BorderColor="Black" BorderWidth="2px" BorderStyle="Solid">
            <columns>
                
                <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" ReadOnly="true" Visible="false">
                    <HeaderStyle ForeColor="White" BackColor="Black" />
                
               <asp:BoundField  DataField="itemNo" HeaderText="itemNo" ReadOnly="true" SortExpression="itemNo" Visible="True">
                  <HeaderStyle ForeColor="White" BackColor="Black" />
                
                  <asp:BoundField DataField="item" HeaderText="item" SortExpression="item" ItemStyle-Wrap="true" ReadOnly="true" ItemStyle-ForeColor="Black" >
                <HeaderStyle Width="300px" BackColor="Black" ForeColor="White" />               

<ItemStyle Wrap="True" ForeColor="Black">
                
                <asp:TemplateField HeaderText="qty" SortExpression="quantity">
                    <edititemtemplate>
                        <asp:TextBox ID="txtQty" runat="server" Text='<%# Bind("quantity") %>'>
                    
                    <itemtemplate>
                        <asp:Label ID="lblQty" runat="server" Text='<%# Bind("quantity") %>'>
                    
                    <HeaderStyle BackColor="Black" ForeColor="White" />
                
                <asp:BoundField DataField="price" HeaderText="price" SortExpression="price" ReadOnly="true" ItemStyle-ForeColor="Black" >
                <HeaderStyle BackColor="Black" ForeColor="White" />
<ItemStyle ForeColor="Black">
                
                <asp:CommandField ShowEditButton="True" />


Я был бы признателен за любую помощь в том, чтобы моя страница корзины работала так, как я намеревался. Заранее спасибо.

Что я уже пробовал:

Dim dt As DataTable
    Dim dr As DataRow

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not IsPostBack Then
            dt = Session("Cart")
            GridView1.DataSource = dt
            GridView1.DataBind()
        Else

            dt = Session("Cart")
            GridView1.DataSource = dt
            GridView1.DataBind()
            If GridView1.Rows.Count = 0 Then
                lblCart.Visible = True
                lblCart.Text = "Your cart is empty, but it doesn't have to be."
                '  lblTotal.Text = "$" & GetItemTotal()
            End If
        End If
    End Sub

 Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
        Dim dt As DataTable = TryCast(Session("Cart"), DataTable)
        '  Dim dt As DataTable = Session("cart")
        '   dt = Session("Cart")
        Dim arow As GridViewRow = GridView1.Rows(e.RowIndex)
        '  Dim row As GridViewRow = GridView1.SelectedRow
        Dim index As Integer = Convert.ToInt32(e.RowIndex)
        'Dim qtb As TextBox = TryCast(arow.FindControl("txtQty"), TextBox) [template field]
        Dim qtb As String = TryCast(arow.Cells(3).Controls(0), TextBox).Text
        '  Dim qtb As TextBox = GridView1.Rows(e.RowIndex).Cells(3).Controls(0)
        Dim strQty As String = e.NewValues(3).ToString()
        Dim newQty As Integer = Convert.ToInt32(strQty)
        ' dt.Rows(index)("quantity") = 10 ' it changes it to "10" in the row I clicked edit link 05/18/18
        ' how do I get the new value in the textbox and put it where the "10" is?
        'If I Then put a value In the textbox, it goes back To original value
        dt.Rows(index)("quantity") = newQty


        '  Dim dt As DataTable = TryCast(Session("Cart"), DataTable)
        '  dt.Rows(index)("quantity") = Integer.Parse(qtb.Text)
        dt.AcceptChanges()
        Session("Cart") = dt
        GridView1.EditIndex = -1
        GridView1.DataSource = dt
        GridView1.DataBind()
        Label2.Text = qtb
        lblCart.Visible = True
        lblCart.Text = index ' shows row # 
        ' edit on left side:
        ' Dim arow As GridViewRow = GridView1.Rows(e.RowIndex)
        'Dim qtb As TextBox = GridView1.Rows(e.RowIndex).Cells(4).Controls(0)
        'Dim newQty As Integer = Integer.Parse(qtb.Text)
        'dt.Rows(e.RowIndex)("quantity") = newQty
        'dt.AcceptChanges()
        'Session("cart") = dt
        'GridView1.EditIndex = -1
        'GridView1.DataSource = Session("cart")
        'GridView1.DataBind()
    End Sub

 Protected Sub GridView1_RowEditing(sender As Object, e As GridViewEditEventArgs) Handles GridView1.RowEditing
        GridView1.EditIndex = e.NewEditIndex
        GridView1.DataSource = dt
        GridView1.DataBind()
    End Sub

    Protected Sub GridView1_RowCancelingEdit(sender As Object, e As GridViewCancelEditEventArgs) Handles GridView1.RowCancelingEdit
        GridView1.EditIndex = -1
        GridView1.DataSource = Session("Cart")
        GridView1.DataBind()
    End Sub

1 Ответов

Рейтинг:
12

Richard Deeming

Цитата:
If Not IsPostBack Then
    dt = Session("Cart")
    GridView1.DataSource = dt
    GridView1.DataBind()
Else
    dt = Session("Cart")
    GridView1.DataSource = dt
    GridView1.DataBind()
    ...


Вы повторно привязываете сетку каждый раз, когда загружается страница, не проверяя, является ли она обратной.

Это приведет к перезаписи всех значений, которые вы изменили с исходными значениями.

Свяжите сетку только в том случае, если IsPostBack возвращается False.


Member 13300069

Как вы это кодируете? Меня смущает обратная связь. Я также хочу получить несколько советов по обновлению строки sub. Я заменил Сабу pageload на:

If IsNothing(Сессия("Корзина")) Затем
- сделай тележку
dt = New DataTable("корзина")
ДТ.колонны.Add("ID", GetType(Integer))
dt.столбцы("ID").Автоувеличение = Истина
dt.столбцы("ID").AutoIncrementSeed = 1
ДТ.колонны.Add("Item", GetType(String))
ДТ.колонны.Add("Quantity", GetType(Integer))
ДТ.колонны.Add("Price", GetType(Decimal))
Сессия("корзина") = dt
Else dt = Session("Cart") ' найти корзину сеанса
Управления gridview1.Источник данных = ДТ
Управления gridview1.Привязку()
'показать пустую этикетку тележки
Если GridView1.Rows.Количество = 0 Тогда

lblCart.Видимое = Истинное
lblCart.Текст = "ваша тележка пуста, но это не обязательно."
'lblTotal.Видна = Ложь
- btnCheckout.Включено = Ложь
- бтнэмпти.Включено = Ложь
Конец, Если
Конец, Если
'lblTotal.Видимое = Истинное
- лблтотал.Text = "$" & GetItemTotal()

Richard Deeming

Удалите код привязки данных из Else ветка.

Я подозреваю, что все это If GridView1.Rows.Count = 0 Then блок должен находиться под If и ветка тоже.

Возможно, Вам будет проще его использовать привязка модели[^] вместо. Во всех примерах используются строго типизированные источники данных, но они также работают с нетипизированными источниками данных. ADO.NET данные.

Member 13300069

Спасибо. Я изменил свой код обновления, и он работает!
Вот что я использовал:

PAGELOAD():
Protected Sub Page_Load(sender As Object, e As EventArgs) обрабатывает меня.Load
- производное от https://www.codeproject.com/Questions/1247297/I-am-having-problems-with-my-VB-code-regarding-upd ответ 06/09/2018
Если Нет IsPostBack То
dt = сессия("корзина")
Управления gridview1.Источник данных = ДТ
Управления gridview1.Привязку()
Еще
dt = сессия("корзина")
Конец, Если
Конец Подводной Лодки

GV1_RowUpadating()
-производное от https://forums.asp.net/t/1067648.aspx?GridView+Update+to+a+datatable 06/09/2018
- переведено с языка Си# на язык VB.net via InstantVB app - ощутимые программные решения, Inc (https://www.tangiblesoftwaresolutions.com)

Защищенные суб GridView1_RowUpdating(как byval отправителя как объект, как byval E Как системы.Веб.Пользовательского интерфейса.WebControls.GridViewUpdateEventArgs) Обрабатывает GridView1.RowUpdating

Дим подряд, как GridViewRow = gridview1, на.Строк(электронная.RowIndex) 'найти строку, которая была нажата для обновления.

Если строка не является ничем, то 'если строка содержит данные
Dim qtb As TextBox = CType(row.FindControl("txtQty"), TextBox) 'найти текстовое поле в шаблоне EditItem в GV1.
ДТ = ctype для(сессия("корзину"), объект DataTable) 'получение значения из DataTable из сессии переменную

- Проходите через таблицу данных, пока не попадете в ту же строку, что и строка, которую нужно обновить.

Для i как целого числа = 0 до dt.строк.Количество - 1
Если e.RowIndex = i, то

dt.Rows(i)("количество") = конвертировать.ToInt32(qtb.Text) ' измените 3-й столбец строки на значение, введенное в текстовое поле.
Session("Cart") = dt 'обновить переменную сеанса с изменениями.
GridView1.EditIndex = -1 'измените индекс редактирования на -1
'Установить dataSource и связать таблицы.
Управления gridview1.Источник данных = ДТ
Управления gridview1.Привязку()
Конец, Если
Затем я
Конец, Если

Конец Подводной Лодки

Я сделал новую загрузку страниц():
Protected Sub Page_Load(sender As Object, e As EventArgs) обрабатывает меня.Load
- производное от https://www.codeproject.com/Questions/1247297/I-am-having-problems-with-my-VB-code-regarding-upd ответ 06/09/2018
Если Нет IsPostBack То
dt = сессия("корзина")
Управления gridview1.Источник данных = ДТ
Управления gridview1.Привязку()

Еще
dt = сессия("корзина")
Конец, Если
Если GridView1.Rows.Количество = 0 Тогда

lblCart.Видимое = Истинное
lblCart.Текст = "ваша тележка пуста, но это не обязательно."
'lblTotal.Видна = Ложь
- btnCheckout.Включено = Ложь
- бтнэмпти.Включено = Ложь
Конец, Если
Конец Подводной Лодки