2011-02-07 86 views
0

有很多关于这个问题,但我还没有能够解决我的问题,使用任何一个答案(经过许多次尝试..)VB.net - 使GridView复选框字段更新数据库中的布尔型字段

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

我想更改由Gridview复选框表示的DoNotMail布尔值并在数据库中自动更新,如果复选框从0(False,Will Mail)复选到1(True,Will 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 [email protected]" 
     Else 
      donotmail.SelectedValue = 0 

      .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString 
      .UpdateCommand = "UPDATE MktDataLeads_scrubbed set [email protected]" 
     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被加下划线并得到以下错误:“句柄子句需要在包含类型或其基础中定义的WithEvents变量类型”。我该如何摆脱?我刚刚删除了该行并在没有它的情况下运行了代码。 3)点击复选框后,“数据库中所选字段的DoNotMail值已更改”文本显示在页面顶部,但是如果我重新运行搜索donotmail = 1,则记录不会因为它从来没有被新的价值更新过。

我很难过。谁能帮忙?这将非常感谢:)

感谢您的答复尼克! UPDATE语句不起作用B/C它没有WHERE子句。它会按原样更新整个表格。这个表没有主键。这里是表格FROM [AgentLeads]。[dbo]。[MktDtaLeads_Scrubbed] - [Last Name],[First Name],[Middle Name],[Suffix],[Address Line 1],[Address Line 2] [城市],[ST],[邮编],[电子邮件地址],[电话树木包],[免费电话树木包],[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

当用户点击一个按钮时,是否可以在整个gridview上进行双向同步,因此每次更改某行时都不必进行更新?因为用户可以选中该复选框,然后选中另一箱则取消一个盒子里,将是一个很大的更新...

回答

0

下面是在默认情况下,GridView控件的代码。aspx:

我使用了该页面上详细介绍的代码的一个变体,并且使其能够工作! 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][email protected] AND [Address Line1][email protected] " 
    Else 
     insertSQL = "UPDATE MktDataLeads_scrubbed " 
     insertSQL &= "SET donotmail=0 " 
     insertSQL &= "WHERE [last name]= @lastname AND [first name][email protected] AND [Address Line1][email protected] " 
    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> 
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 [email protected]" 
      Else 
       donotmail.SelectedValue = 0 

       .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString 
       .UpdateCommand = "UPDATE MktDataLeads_scrubbed set [email protected]" 
      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> 
+0

UPDATE语句不起作用b/c它没有WHERE子句。它会按原样更新整个表格。这个表没有主键。以下是表格的字段:SELECT [Last Name],[First Name],[Middle Name],[Suffix],[Address Line 1],[Address Line 2],[City],[ST],[ZipCode ],[电子邮件地址],[电话号码],[免费号码],[插入日期],[发送日期],[DoNotMail] FROM [AgentLeads]。[dbo]。[MktDtaLeads_Scrubbed] – 2011-02-08 13:27:54

0

我最终得到批准,可以增加一个主键列以数据库的名称更简单地调用每条记录,并通过从数据库调用存储过程(更快)而不是从代码隐藏(较慢)运行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 

这里为GridView上的Default.aspx前端编码:

 <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> 
相关问题