2011-02-07 67 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> 
相關問題