刷新数据集后,如何在datagridview中保留相同的行?

时间:2014-03-05 16:20:07

标签: sql vb.net datagridview timer dataset

此代码从计时器tick事件中调用,以便dataviewgrid频繁刷新。

从我在SO上找到的其他答案我希望此代码将所选行重置为在此代码运行之前选择的行,刷新我的数据集。

只有变量CurrentSelectedRow是一个公共变量,其他所有变量都是本地变量。

sql = "select top 10 batch, TrussName, PieceName from FitaPieces order by SawTime desc "

    myDataset = SelectFromDB(sql)

    MyPreviouslyCutPieces.ClearAll()

    Me.dgvPreviouslyCut.SelectionMode = DataGridViewSelectionMode.FullRowSelect

    If Not IsNothing(Me.dgvPreviouslyCut.CurrentRow) Then
        Debug.Print(Now.ToString & "...Current Row = " & Me.dgvPreviouslyCut.CurrentRow.ToString)
        CurrentSelectedRow = Me.dgvPreviouslyCut.CurrentRow.Index
    Else
        Debug.Print(Now.ToString & "...Current Row = -1")
        CurrentSelectedRow = -1
    End If

    If Not myDataset Is Nothing Then
        If myDataset.Tables("CurData").Rows.Count > 0 Then

            Me.dgvPreviouslyCut.DataSource = myDataset
            Me.dgvPreviouslyCut.DataMember = "CurData"

        End If
    End If

    If CurrentSelectedRow <> -1 Then
        Me.dgvPreviouslyCut.Rows(0).Selected = False
        Me.dgvPreviouslyCut.Rows(CurrentSelectedRow).Selected = True
    End If

它确实......对于计时器事件的第一个滴答。在用户选择行之后的第二个tick事件上,它将恢复为所选的第一行。即使变量CurrentSelectedRow是一个公共变量,它也会在第一个tick事件后重置为零。然后,所选行将切换回网格中的第一行。刷新网格的数据源时会自动选择第一行,但刷新后我将其选中状态设置为false。

如何将dataviewgrid的选定行重置为第一行?

3 个答案:

答案 0 :(得分:2)

获取当前索引并将其存储在名为“go_back_to_index”

的变量中
Dim go_back_to_index as integer

当用户点击网格中的行时,只需保存该值,以便稍后突出显示:

go_back_to_index = current_data_grid.currentRow.value

然后当网格更新时,只需运行这段代码:

If go_back_to_index < current_data_grid.Rows.Count Then
      current_data_grid.Rows(go_back_to_index).Selected = True
      current_data_grid.CurrentCell = current_data_grid.Item(1, go_back_to_index)
End If

请务必确保设置数据网格,以便在单击单元格时突出显示整行。

答案 1 :(得分:0)

之所以发生这种情况,是因为您在每个周期都在更改网格的DataSource

解决此问题的最佳方法(但最困难的方法)是在VirtualMode中运行DataGridView。

如果没有,则应仅将数据源设置为。当您需要更新表时,将绑定到网格的表与新表合并。

DirectCast(Me.dgvPreviouslyCut.DataSource, DataTable).Merge(myDataset.Tables("CurData"))

答案 2 :(得分:-2)

如果你似乎无法使DataGridView工作。尝试不同的控制,直到问题得到解决。我亲自使用列表框来实现同样的目标。