比较两个datagridview并删除依赖于行属性的行

时间:2014-09-07 19:24:45

标签: sql vb.net datagridview rows

我目前正在使用vb.net windows表单应用程序。我有两个DataGridViews,我希望交叉引用行并从datagridview1中删除某些行,具体取决于是否在checkbox中选中了datagridview2。当我检查datagridview1中更新datagridview2的前端用户所执行操作的复选框时,会出现此问题。但是,当我同时刷新DataGridViews时,datagridview2会显示已执行此操作,但checkbox中的datagridview1列会返回未选中状态,从而告知前端用户重复这个动作。

另外注意,除checkbox中的datagridview1列外,所有数据都绑定到sql表。另请注意,我有一个刷新按钮,重复加载事件以刷新两个表。

页面加载事件处理程序:

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'load datagridview1'
    Dim ds As New DataSet
    Dim AA As New DataSet
    connectionstring = "Data source = .\sqlexpress; integrated security = true"
    connection = New SqlConnection(connectionstring)
    sql = "SELECT Shear FROM production.dbo.stagingcompleted"
    Try
        connection.Open()
        adapter = New SqlDataAdapter(sql, connectionstring)
        adapter.Fill(ds)
        connection.Close()
        DataGridView1.DataSource = ds.Tables(0)
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    'load datagridview2'
    connectionstring = "Data source = .\sqlexpress; integrated security = true"
    connection = New SqlConnection(connectionstring)
    sql = "SELECT * FROM production.dbo.tblFCOrdered"
    Try
        connection.Open()
        adapter = New SqlDataAdapter(sql, connectionstring)
        adapter.Fill(AA)
        connection.Close()
        DataGridView2.DataSource = AA.Tables(0)
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

DataGridView1事件处理程序(CellContentClick):

Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    'update datagridview1 to the action for that row complete'
    If e.ColumnIndex <> 0 Then
        Exit Sub
    End If
    Dim v As String = DataGridView1.Rows(e.RowIndex).Cells(1).Value
    Select Case MsgBox("Are you sure shear " & v & " has been cut?", MsgBoxStyle.YesNo)
        Case MsgBoxResult.No
            Exit Sub
        Case MsgBoxResult.Yes
            Try
                Dim connstring = "Data Source=.\sqlexpress; integrated security = true"
                Using conn1 As New SqlConnection(connstring)
                    conn1.Open()
                    Using comm1 As SqlCommand = New SqlCommand("UPDATE Production.dbo.tblFCOrdered SET FormChannel = 1 WHERE SHEAR = '" & v & "'", conn1)
                        comm1.ExecuteNonQuery()
                        conn1.Close()
                    End Using
                End Using
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
    End Select

1 个答案:

答案 0 :(得分:0)

我可能不正确,如果你已经尝试过,我道歉。我相信您可以通过阅读页面生命周期,订单事件处理程序以及PostBack的效果(例如this article

获益
  

在服务器控件中,某些事件(通常是单击事件)会使页面立即回发到服务器。在HTML服务器控件和Web服务器控件(如TextBox控件)中更改事件不会立即导致发布。相反,它们会在下一次发布时被提升。

关于PostBackPage.Load

  

在回发页面后,会引发页面的初始化事件(Page_InitPage_Load),然后处理控制事件。除非您具有页面事件处理的详细知识,否则不应创建依赖于按特定顺序引发的更改事件的应用程序逻辑。

我认为您遇到的问题的一部分是,当您触发PostBack时页面会做的第一件事,例如单击一个单元格,是您在Page.Load事件处理程序中的代码。在您的代码中,您会发现在处理页面时(在PostBack上),首先发生的是网格是数据绑定的。因此,在调用其他事件处理程序时,所做的任何更改都不会保留。在Page.Load函数中执行数据绑定等操作之前的常见检查是检查页面是否未被回发,如果IsPostBack = true您可能希望跳过此类操作。