如何将每个文本框的值更新到gridview中的每一行列,然后将值更新到数据库中

How to update each textbox value to each row column in gridview, then update the value into database

在编码过程中遇到了一些困难,求助于大家。 我在 gridview 中添加了文本框,并在 gridview 中绑定了数据库详细信息。 文本框的用途是更新名为 "Total Quantity Redeemed" 的列中的值。 我编写了以下代码,但出现了问题。 对于所有列值,只有最后一行文本框值会更新。 例如,我的最后一行文本框值为“2”,数据库会将 "Total Quantity Redeemed" 的所有列更新为 2。这可能是因为我的 for 循环? 或者我应该使用 rowdatabound? 希望有人能解开我的疑惑,谢谢

我的 HTML 代码(网格视图)

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BorderWidth="1px" 
        CellPadding="3" GridLines="Vertical" HeaderStyle-Height="30px" style="border-left-color: black; border-bottom-color: black; border-top-style: dashed; border-top-color: black; border-right-style: dashed; border-left-style: dashed; background-color: silver; border-right-color: black; border-bottom-style: dashed" BackColor="White" BorderColor="#999999" BorderStyle="None">
        <Columns>
        <asp:TemplateField  HeaderText="Transaction No" >
                <HeaderStyle HorizontalAlign="Left" Width="70px"/>
                <ItemTemplate>
                    <asp:Label ID="lblTransactionNo" runat="server" text='<%# Eval("TransactionNo") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

            <asp:BoundField DataField="PaymentDateTime" HeaderText="Payment Date Time">
                <HeaderStyle HorizontalAlign="Left" />
            </asp:BoundField>
            <asp:BoundField DataField="ItemCode" HeaderText="Ticket Code"  >
                <HeaderStyle HorizontalAlign="Left" Width="65px"/>
            </asp:BoundField>
            <asp:BoundField DataField="programdesc" HeaderText="Program Description">
                <HeaderStyle HorizontalAlign="Left" Width="95px" />
            </asp:BoundField>

            <asp:TemplateField  HeaderText="Quantity Available">
                <HeaderStyle HorizontalAlign="Left" Width="70px"/>
                <ItemTemplate>
                    <asp:Label ID="lblAvailable" runat="server" text='<%# Eval("Quantity") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField  HeaderText="Total Quantity Redeemed">
                <HeaderStyle HorizontalAlign="Left" Width="70px"/>
                <ItemTemplate>
                    <asp:Label ID="lblRedeemedQty" runat="server" text='<%# Eval("RedeemedQuantity") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Quantity to Redeem" ShowHeader="False">
            <HeaderStyle HorizontalAlign="Left" Width="95px" />
                <ItemTemplate>
                    <asp:TextBox ID="txtRedeem" runat="server" Text="0"></asp:TextBox>
                     <asp:CompareValidator Display="Dynamic" ID="CompareValidator1" Operator="DataTypeCheck" Type="Integer"  runat="server" ErrorMessage="Only Integer!" ControlToValidate="txtRedeem"></asp:CompareValidator>
                     <asp:RequiredFieldValidator Display="Dynamic" ID="RequiredFieldValidator1" runat="server" ErrorMessage="Key In Value!" ControlToValidate="txtRedeem"></asp:RequiredFieldValidator>
                </ItemTemplate>
                <ItemStyle HorizontalAlign="Left" />
            </asp:TemplateField>
        </Columns>

        <HeaderStyle CssClass="gridheader" Height="30px" BackColor="#000084" Font-Bold="True" ForeColor="White" />
        <AlternatingRowStyle CssClass="gridaltrow" BackColor="#DCDCDC" />
        <RowStyle CssClass="gridrow" BackColor="#EEEEEE" ForeColor="Black" />
        <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
    </asp:GridView>

我的后台代码

Partial Class _Default
    Inherits System.Web.UI.Page

    Dim sqlQuery As String
    Dim conn As SqlConnection = New SqlConnection("Server=gsc-volvo-Hp;Database=GET_PANORAMA;Trusted_Connection=True;")
    Dim cmd As SqlCommand
    'Dim dr As SqlDataReader
    Dim da As SqlDataAdapter = New SqlDataAdapter()


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If (Page.IsPostBack = False) Then

            Dim cmd As SqlCommand
            'Dim dr As SqlDataReader
            Dim da As SqlDataAdapter = New SqlDataAdapter()

            conn.Open()
            sqlQuery = "SELECT webtpay_trn.*,PaymentDateTime from webtrcp_trn inner join webtpay_trn on (webtrcp_trn.TransactionNo = webtpay_trn.TransactionNo)"
            cmd = New SqlCommand(sqlQuery, conn)
            da.SelectCommand = New SqlCommand(sqlQuery, conn)

            GridView1.DataSource = cmd.ExecuteReader()
            GridView1.DataBind()
            conn.Close()
        End If

    End Sub




Private Sub CheckQty()
Dim row As GridViewRow
Dim total As Integer
lblMessage.Text = ""

For Each row In GridView1.Rows
    Dim lblAvailable As Integer
    Dim lblRedeemedQty As Integer
    Dim amtRedeem As Integer
    Dim transNo As String

    ' write ur DB process code here

    row.ForeColor = Drawing.Color.Empty
    lblMessage.ForeColor = Drawing.Color.Empty

    Try
        lblAvailable = CType(row.FindControl("lblAvailable"), Label).Text
        amtRedeem = CType(row.FindControl("txtRedeem"), TextBox).Text
        lblRedeemedQty = CType(row.FindControl("lblRedeemedQty"), Label).Text
        transNo = CType(row.FindControl("lblTransactionNo"), Label).Text

    Catch ex As Exception
        lblError.ForeColor = System.Drawing.Color.Red
        lblError.Text = "** Error Occur In Quantity Redeem.Default=0 **"
    End Try

    total = total + amtRedeem

    If (amtRedeem > lblAvailable) Or amtRedeem < 0 Then
        lblMessage.ForeColor = System.Drawing.Color.Red
        lblMessage.Text = "** Quantity Error or Insufficient. Please Check Your Redeem Quantity **"

        row.ForeColor = Drawing.Color.Red
        row.Focus()

        Exit For

    ElseIf total = 0 Then
        lblMessage.ForeColor = System.Drawing.Color.Red
        lblMessage.Text = "** No Amount Entered. Please Enter Some Value **"

    Else


    sqlQuery = sqlQuery + "Update WebTpay_Trn set RedeemedQuantity =RedeemedQuantity + '" & amtRedeem & "' "
    sqlQuery = sqlQuery + " WHERE webtpay_trn.TransactionNo = '" & transNo & "'  "
        Dim cmd As SqlCommand = New SqlCommand(sqlQuery, conn)

        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()

        'lblMessage.ForeColor = System.Drawing.Color.Green
        lblMessage.Text = " Total Redeem =  " + total.ToString + " Tickets "
        'Response.Redirect("showTicketRedeem.aspx")
    End If

Next
End Sub


    Protected Sub btnRedeem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRedeem.Click

        CheckQty()

    End Sub

End Class

好的,我想问题是您已经声明了变量 amtRedeem and total outside the loop,因此这些变量在下一次迭代中保持 old values。所以你需要声明这些inside the loop。我不确定变量 totalamtRedeem 必须在循环内。

For Each row In GridView1.Rows
Dim amtRedeem As Integer
Dim total As Integer
//Rest of your code will remain same.

认为可能是SQL更新语句

 UPDATE WebTpay_Trn set RedeemedQuantity = '" & amtRedeem & "' 
 FROM webtrcp_trn INNER JOIN webtpay_trn ON 
 (webtrcp_trn.TransactionNo = webtpay_trn.TransactionNo)

没有 WHERE 语句,因此每个 RedeemedQuantity 字段都使用当前行的 txtRedeem 文本框的值进行更新。

添加一个项目模板来保存每一行的 TransactionNo,就像您为 RedeemedQuantity 所做的那样

 <asp:TemplateField  HeaderText="TransactionNo">
            <ItemTemplate>
             <asp:Label ID="lblTransactionNo" runat="server" text='<%# Eval("TransactionNo") %>'>
             </asp:Label>
           </ItemTemplate>
       </asp:TemplateField>

添加一个变量来保存该行的交易编号(例如使用名为 lblTransactionNo 的标签)

Dim transactionNo as string = lblTransactionNo.Text

您需要添加引用该行的 TransactionNo

的 WHERE 语句

类似

sqlQuery = String.Format("UPDATE WebTpay_Trn set RedeemedQuantity = {0} 
WHERE webtrcp_trn.TransactionNo = {1}", amtRedeem, transactionNo)

我不确定这是否是解决方案,但我的值可以毫无问题地获取每个文本框并将其插入到每个特定行,感谢 Peter Campbell 和 Mairaj Ahmad 的帮助。

持有我的交易号如下: Dim lblTransactionNo As Label = DirectCast(row.FindControl("lblTransactionNo"), 标签)

sqlQuery = "Update WebTpay_Trn set RedeemedQuantity = RedeemedQuantity + '" & amtRedeem & "' "
                    sqlQuery = sqlQuery + " WHERE TransactionNo = '" & lblTransactionNo.Text & "' "
                    'sqlQuery = String.Format("UPDATE WebTpay_Trn set RedeemededQuantity = {0} WHERE webtPay_trn.TransactionNo = {1}", amtRedeem, lbltransactionNo)

                    Dim cmd As SqlCommand = New SqlCommand(sqlQuery, conn)

                    conn.Open()
                    cmd.ExecuteNonQuery()
                    conn.Close()