如何将每个文本框的值更新到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
。我不确定变量 total
但 amtRedeem
必须在循环内。
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()
在编码过程中遇到了一些困难,求助于大家。 我在 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
。我不确定变量 total
但 amtRedeem
必须在循环内。
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()