【问题标题】:VB.net - make Gridview checkbox field update boolean field in databaseVB.net - 使 Gridview 复选框字段更新数据库中的布尔字段
【发布时间】:2011-06-23 01:44:55
【问题描述】:

对此有很多问题,但我无法使用其中任何一个的答案来解决我的问题(经过多次尝试......)

我正在使用 vb.net 创建一个 asp.net Web 应用程序。我的页面上有一个 SqlDataSource 和一个 GridView。

我想更改由 Gridview 复选框表示的 DoNotMail 布尔值,如果复选框从 0(False,Will Mail)选中到 1(True,Won't Mail),则在数据库中自动更新这是我的代码用过的。

对于default.aspx.vb后面的代码我加了:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    lastname.Focus()
    If Page.IsPostBack Then
        Response.Write("The DoNotMail value has been changed in the database for the selected field")
    End If

End Sub

Public Sub checkbox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    With Me.SqlDataSource1
        Dim box As CheckBox = DirectCast(sender, CheckBox)
        If box.Checked = True Then
            donotmail.SelectedValue = 1

            .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
            .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
        Else
            donotmail.SelectedValue = 0

            .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
            .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
        End If
    End With

End Sub

对于我添加的default.aspx页面:

                 <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
                 <ItemTemplate>         
                 <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox1_CheckedChanged" Checked='<%# Bind("DoNotMail") %>'
                               Enabled="true" />     
                 </ItemTemplate>     
                 <EditItemTemplate>         
                 <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox1_CheckedChanged" Checked='<%# Bind("DoNotMail") %>' />     
                 </EditItemTemplate>       
                 </asp:TemplateField> 

1) 我很确定我的更新命令语法在默认代码隐藏部分中不正确。有谁知道正确的语法?
2) 我收到错误:当我在代码后面部分添加“Handles CheckBox1.CheckedChanged”时,CheckBox1 带有下划线并出现以下错误:“Handles 子句需要在包含类型或其基本类型之一中定义的 WithEvents 变量” .我该如何摆脱它?我只是删除了该行并在没有它的情况下运行了代码。 3) 单击复选框后,“所选字段的数据库中的 DoNotMail 值已更改”文本显示在页面顶部,但如果我重新运行搜索 donotmail=1,则不会显示记录up 因为它从未更新过新值。

我很困惑。任何人都可以帮忙吗?将不胜感激:)

感谢尼克的回复! UPDATE 语句不起作用 b/c 它没有 WHERE 子句。它将按原样更新整个表。表没有主键。以下是表格的列 FROM [AgentLeads].[dbo].[MktDtaLeads_Scrubbed] - [Last Name] ,[First Name] ,[Middle Name] ,[Suffix] ,[Address Line 1] ,[Address Line 2] ,[City] ,[ST] ,[ZipCode] ,[Email Address] ,[Phone Nbr] ,[Toll Free Nbr] ,[InsertDate] ,[SentDate] ,[DoNotMail]

其中 AgentLeads 是数据库,MktDtaLeads_Scrubbed 是表。如何指定行?所以我会说:

.UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail" WHERE [last name]=@lastname.selectedrow AND [first name]=@firstname.selectedrow AND [Address Line 1]=@Address Line 1.selectedrow

当用户点击按钮时,是否可以在整个网格视图上进行双向同步,这样您就不必在每次更改行时都进行更新?因为用户可能会选中该框,然后选中另一个框,然后取消选中一个框,这将是很多更新...

【问题讨论】:

    标签: sql vb.net gridview checkbox boolean


    【解决方案1】:

    你会想要使用GridView.RowCommand event

    确保将 OnRowCommand 侦听器添加到 GridView,然后进行相应更新

    Public Sub gridview1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
         If e.CommandName = "UpdateDoNotMail" Then
            With Me.SqlDataSource1
               Dim box As CheckBox = DirectCast(sender, CheckBox)
               If box.Checked = True Then
                   donotmail.SelectedValue = 1
    
                   .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
                   .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
               Else
                   donotmail.SelectedValue = 0
    
                   .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
                   .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
               End If
           End With
        End If
    End Sub
    

    和模板字段

                 <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
                 <ItemTemplate>         
                 <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" CommandName="UpdateDoNotMail" Checked='<%# Bind("DoNotMail") %>'
                               Enabled="true" />     
                 </ItemTemplate>     
                 <EditItemTemplate>         
                 <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" CommandName="UpdateDoNotMail" Checked='<%# Bind("DoNotMail") %>' />     
                 </EditItemTemplate>       
                 </asp:TemplateField> 
    

    【讨论】:

    • UPDATE 语句不起作用 b/c 它没有 WHERE 子句。它将按原样更新整个表。表没有主键。以下是表格的字段 - SELECT [Last Name] ,[First Name] ,[Middle Name] ,[Suffix] ,[Address Line 1] ,[Address Line 2] ,[City] ,[ST] ,[ZipCode ] ,[Email Address] ,[Phone Nbr] ,[Toll Free Nbr] ,[InsertDate] ,[SentDate] ,[DoNotMail] FROM [AgentLeads].[dbo].[MktDtaLeads_Scrubbed]
    • 感谢尼克的回复!其中 AgentLeads 是数据库,MktDtaLeads_Scrubbed 是表。如何指定行?所以我会说: .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail" WHERE [last name]=@lastname.selectedrow AND [first name]=@firstname.selectedrow AND [Address Line 1]=@Address Line 1.selectedrow
    • 是否可以在用户点击按钮时在整个网格视图上进行双向同步,这样您就不必在每次更改行时都进行更新?因为用户可能会选中该框,然后选中另一个框,然后取消选中一个框,这将是很多更新...
    • 第二条评论:检查复选框上的 CommandArgument,然后您可以在侦听器中使用 e.CommandArgument 访问该数据。
    • 如果您想在执行数据库事务之前等待用户选中/取消选中所有项目,则必须以其他方式处理此问题。您需要放弃整个 RowCommand 事件侦听器的想法,并在 GridView 中有一个单独的更新按钮,该按钮查看 GridView 的每一行以进行更新,例如一个隐藏控件,它保存“当前”值并将复选框与该值进行比较在检查所有行后构建要执行的查询。不过恕我直言,这听起来是实现一些 Ajax 的好地方。
    【解决方案2】:

    这是 default.aspx 上 GridView 的代码:

    我使用了此页面上详述的代码的变体并让它工作! vb.net SQL query works in SQL server but not when called from checkbox

    对于default.aspx.vb后面的代码我加了:

        Public Sub checkbox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 'Handles checkbox.CheckedChanged
        Dim connectionString As String = ConfigurationManager.ConnectionStrings("AgentLeadsConnectionString").ConnectionString
    
    
        Dim box As CheckBox = DirectCast(sender, CheckBox)
        Dim tblcell As TableCell = CType(box.Parent, TableCell)
        Dim dgRow As GridViewRow = CType(tblcell.Parent, GridViewRow)
    
        Dim lastname As String = [last name].Rows(dgRow.DataItemIndex).Cells(0).Text
        Dim firstname As String = [first name].Rows(dgRow.DataItemIndex).Cells(0).Text
        Dim address As String = [Address Line1].Rows(dgRow.DataItemIndex).Cells(0).Text
    
        Dim insertSQL As String
    
        If box.Checked = True Then
            insertSQL = "UPDATE MktDataLeads_scrubbed "
            insertSQL &= "SET donotmail=1 "
            insertSQL &= "WHERE [last name]= @lastname AND [first name]=@firstname AND [Address Line1]=@address "
        Else
            insertSQL = "UPDATE MktDataLeads_scrubbed "
            insertSQL &= "SET donotmail=0 "
            insertSQL &= "WHERE [last name]= @lastname AND [first name]=@firstname AND [Address Line1]=@address "
        End If
    
        Using con As New SqlConnection(connectionString)
            Dim cmd As New SqlCommand(insertSQL, con)
            cmd.Parameters.AddWithValue("@donotmail", donotmail)
            Try
                con.Open()
                cmd.ExecuteNonQuery()
            Catch Err As SqlException
                MsgBox("Error", 65584, "Insertion Error")
            End Try
            con.Close()
        End Using
    
    End Sub
    

    对于gridview,我使用了相同的代码:

                 <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
                 <ItemTemplate>         
                 <asp:CheckBox ID="CheckBox" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("DoNotMail") %>'
                               Enabled="true" />     
                 </ItemTemplate>     
                 <EditItemTemplate>         
                 <asp:CheckBox ID="CheckBox" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("DoNotMail") %>' />     
                 </EditItemTemplate>       
                 </asp:TemplateField>
    

    【讨论】:

      【解决方案3】:

      我最终获得了通过 ID 名称向数据库添加主键列的权限,以便更轻松地调用每条记录,并通过从数据库调用存储过程(更快)而不是从运行 SQL 命令来优化代码背后的代码(较慢)。

      对于我输入的default.aspx.vb:

      Public Sub checkbox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 'Handles checkbox.CheckedChanged 
          With Me.SqlDataSource1
              Dim connectionString As String = ConfigurationManager.ConnectionStrings("AgentLeadsConnectionString").ConnectionString
      
      
              .UpdateParameters.Clear()
      
              .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
              .UpdateCommand = "up_UpdateMktDataLeads"
              .UpdateParameters.Add("donotmail", Me.donotmail.Text)
              .UpdateCommandType = SqlDataSourceCommandType.StoredProcedure
      
          End With
      
          GridView2.DataBind()
      
      End Sub
      

      下面是代码调用的存储过程:

           PROCEDURE [dbo].[up_UpdateMktLeadsDoNotMail]
      
                 @ID integer, 
                 @DoNotMail bit
      
           AS
      
           UPDATE [dbo].[MktDtaLeads_Scrubbed]
      
           SET [DoNotMail] = @DoNotMail
      
           WHERE [ID] = @ID
      

      这是 default.aspx 上 GridView 的前端代码:

              <asp:GridView ID="GridView2" runat="server" CellPadding="2" 
                  DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" 
                  AutoGenerateColumns="False">
                  <Columns>
                      <asp:BoundField DataField="Last Name" HeaderText="Last Name" 
                          SortExpression="Last Name" />
                      <asp:BoundField DataField="First Name" HeaderText="First Name" 
                          SortExpression="First Name" />
                      <asp:BoundField DataField="Address Line 1" HeaderText="Addr 1" 
                          SortExpression="Address Line 1" />
                      <asp:BoundField DataField="Address Line 2" HeaderText="Addr 2" 
                          SortExpression="Address Line 2" />
                      <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                      <asp:BoundField DataField="ST" HeaderText="ST" SortExpression="ST" />
                      <asp:BoundField DataField="ZipCode" HeaderText="ZipCode" 
                          SortExpression="ZipCode" />
                      <asp:BoundField DataField="Email Address" HeaderText="Email Addr" 
                          SortExpression="Email Address" />
                      <asp:BoundField DataField="Phone Nbr" HeaderText="Phone Nbr" 
                          SortExpression="Phone Nbr" />
      
                   <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
                   <ItemTemplate>         
                   <asp:CheckBox ID="CheckBox" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("DoNotMail") %>'
                                 Enabled="true" />     
                   </ItemTemplate>     
                   <EditItemTemplate>         
                   <asp:CheckBox ID="CheckBox" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("DoNotMail") %>' />     
                   </EditItemTemplate>       
                   </asp:TemplateField>
      
                  </Columns>
                  <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                  <RowStyle BackColor="#EFF3FB" Font-Size="Smaller" />
                  <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                  <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                  <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                  <EditRowStyle BackColor="#2461BF" />
                  <AlternatingRowStyle BackColor="White" />
              </asp:GridView>
      

      【讨论】:

        猜你喜欢
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 2017-03-22
        • 2011-06-13
        • 2014-01-04
        • 1970-01-01
        相关资源
        最近更新 更多