【问题标题】:Updating Datagridview when datasource changes数据源更改时更新 Datagridview
【发布时间】:2017-05-27 13:19:17
【问题描述】:

我有一个绑定到数据表的 Datagridview。我想根据单元格的值隐藏或显示一行,例如,如果单元格值为“N”,则使该行可见,否则如果为“Y”,则隐藏该行。

数据列设置为:

New DataColumn With {.ColumnName = "Rec", .AllowDBNull = False, .DefaultValue = "N", .DataType = GetType(String)}

我还处理了 Datagridview 的 CellValueChanged 事件,如下所示:

Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    If CType(sender, DataGridView).Columns(e.ColumnIndex).HeaderText.Equals("Rec") Then
        CType(sender, DataGridView).Rows(e.RowIndex).Visible = CType(sender, DataGridView).Item(e.ColumnIndex, e.RowIndex).Value.Equals("N")
    End If
End Sub

但是当我以编程方式将值更改为“Y”时(我可以看到网格中的值已更改),该行仍然可见。我还在事件处理程序中设置了一个中断,它没有被触发!那么问题来了,当我将单元格值更改为“Y”时,如何隐藏 datagridviewrow?

编辑

为了让手头的问题更加清晰,这就是我以编程方式更新网格数据源的方式:

CType(DataGridView1.DataSource, DataTable).Item("Rec") = "Y"

我可以直接更新网格并因此触发 cellvaluechanged 事件,但是这会引发 CurrencyManager 错误,因此每次单元格值更新时都必须暂停绑定然后恢复绑定到网格。这很有效,但即使是对于一个小数据集(即使通过反射实现双缓冲)也是如此。

【问题讨论】:

  • DataTable删除行。
  • 如果我从数据表中删除该行,将无法再更新该行以使其在 datagridview 中再次可见。
  • 如果您在 datagridview 中隐藏行 - 那么如何将单元格值更改回 N?
  • 就像我在问题中明确指出的那样,我以编程方式更改了值(阅读最后一段)。
  • 用户如何将任何内容设置为不可见的行上的任何内容?

标签: vb.net datagridview datagridviewrow


【解决方案1】:

尝试将 DataTable 绑定到 BindingSource(控件),然后将其绑定到您的网格,而不是直接绑定到 DataTable。然后,您可以使用 BindingSource 中的事件来检查数据何时发生更改,无论是从网格中的更改还是直接对数据表的编程更改。

另外,DataTable 会触发一些事件,您可以挂钩这些事件以确定数据何时发生更改。

【讨论】:

    【解决方案2】:

    好的,当您更新单元格值时,您会从升级后的单元格中提取行索引,并在下一步中隐藏单元格,例如:

     DataGridView1.Rows.Item(rowindex).Visible = False
    

    所以我做了一个测试:

    DataGridView1(1, 2).Value = "Y"
    DataGridView1.Rows.Item(2).Visible = False
    

    它有效。

    【讨论】:

    • 是的,看看我原来的问题(和编辑),它清楚地表明直接更新控件是有效的,但是除了需要暂停绑定等之外非常慢,而更新数据表非常速度很快,但是不会切换行的可见性。
    【解决方案3】:

    是的,我通过部分使用 @John0987 的建议解决了这个问题,因为我面临的问题似乎比我说的要复杂一些。基本上,这是一个 hack,我将表单范围的布尔变量初始化为 false 并处理 DataGridView 的 DataBindingComplete 事件,该事件将布尔值设置为 true 并在 CellValueChanged 事件中添加布尔检查,然后再使行不可见。到目前为止,这一切都完美无缺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多