鼠标滚动后单击,DataGridView将重置为顶部

时间:2019-07-01 05:53:43

标签: vb.net

我在Windows窗体应用程序的TabPage上有一个DataGridView控件。

当用户将鼠标移到DataGrid上并使用滚轮时,网格将按预期滚动。但是,当用户单击屏幕上的某个单元格而不是该单元格获得焦点时,DataGrid将重置为顶部,并要求用户再次向下滚动。此响应是非直觉的,因为并不能立即明显地表明您认为单击的单元格不再存在。

在用户单击网格之前,我很乐意阻止DataGrid对滚轮作出响应,或者最好保持当前操作,除非第一次单击时不重置到顶部。

根据我在这里进行的研究,看来DataGrid正在重新绑定,因为在进入选项卡页面时我正在重置绑定(因为数据库可能已被其他选项卡之一更新了。

Private Sub TabPage1_Enter(sender As Object, e As EventArgs) Handles TabPage1.Enter
        LoadTACTable()
    End Sub

LoadTACTable()中:

dbGetList("spSelectTACList", dtTACs, 0, 100000, Nothing)  ' Record numbers are 0 based
        bsTACs.DataSource = dtTACs
        With gridTACs
            ' TOTAL Grid width = 1380
            .DataSource() = bsTACs
            .
            .
            .

(为简洁起见,仅显示部分代码。

是否可以查看输入时TabPage是否已经显示?还是不需要每次使用gridTAC子集将SQL数据库中的数据检索到dtTACs数据表时就重置dbGetList()数据源吗?

2 个答案:

答案 0 :(得分:0)

有几种可能的解决方案来解决您的问题。一种可能是不自动重新绑定数据网格,而是让用户通过单击一些刷新按钮来完成。这样用户将不会看到非直觉的行为。

您提到在更改其他选项卡的内容时可能需要刷新一个选项卡的内容。每当选项卡的内容更改并且可能影响其他选项卡时,您都可以标记其他选项卡(例如,通过在其标题中添加星号)来指示它们不再具有最新数据。然后,用户将知道该标签需要刷新。

也许还有其他解决方案,但是如果不了解您的用例就很难说出来。

答案 1 :(得分:0)

通过以上指导,我相信我已经解决了该问题:

我创建了一个标志:

Dim TabDirty As Boolean

然后我在TabPage.Leave处理程序中设置它:

Private Sub TabPage1_Leave(sender As Object, e As EventArgs) Handles TabPage1.Leave
        dtTACs.Dispose()
        TabDirty = True
    End Sub

然后,当我进入TabPage时就进行检查:

Private Sub TabPage1_Enter(sender As Object, e As EventArgs) Handles TabPage1.Enter
        If TabDirty = True Then
            TabDirty = False
            LoadTACTable()
        End If
    End Sub

到目前为止,这似乎可行-单击时网格未重置,但是我将做更多测试以确认在必要时刷新了数据。