我目前正在使用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
答案 0 :(得分:0)
我可能不正确,如果你已经尝试过,我道歉。我相信您可以通过阅读页面生命周期,订单事件处理程序以及PostBack
的效果(例如this article)
在服务器控件中,某些事件(通常是单击事件)会使页面立即回发到服务器。在HTML服务器控件和Web服务器控件(如TextBox控件)中更改事件不会立即导致发布。相反,它们会在下一次发布时被提升。
关于PostBack
和Page.Load
:
在回发页面后,会引发页面的初始化事件(
Page_Init
和Page_Load
),然后处理控制事件。除非您具有页面事件处理的详细知识,否则不应创建依赖于按特定顺序引发的更改事件的应用程序逻辑。
我认为您遇到的问题的一部分是,当您触发PostBack
时页面会做的第一件事,例如单击一个单元格,是您在Page.Load
事件处理程序中的代码。在您的代码中,您会发现在处理页面时(在PostBack
上),首先发生的是网格是数据绑定的。因此,在调用其他事件处理程序时,所做的任何更改都不会保留。在Page.Load
函数中执行数据绑定等操作之前的常见检查是检查页面是否未被回发,如果IsPostBack = true
您可能希望跳过此类操作。