数据源更改时更新Datagridview

时间:2017-01-12 12:19:05

标签: vb.net datagridview datagridviewrow

我有一个绑定到数据表的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" (我可以看到网格中的值已更改),该行仍然可见。我还在事件处理程序中放了一个休息时间,它没有被触发!那么问题是,当我将一个cellvalue更改为" Y"?

时,如何隐藏datagridviewrow?

修改

为了更清楚地说明手头的问题,这就是我以编程方式更新网格数据源的方式:

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

我可以直接更新网格,因此触发cellvaluechanged事件,但这会抛出CurrencyManager错误,因此必须暂停绑定,然后每次更新单元格值时重新绑定到网格。即使是一个小型数据集(即使通过反射实现双缓冲),这种方法仍然有效,但速度很慢。

3 个答案:

答案 0 :(得分:1)

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

或者,可以通过DataTable触发事件来确定数据何时发生更改。

答案 1 :(得分:0)

O.K当您更新cellvalue时,您从升级的单元格中提取rowindex,并在下一步中隐藏单元格,例如:

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

所以对于测试我做了这个:

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

它有效。

答案 2 :(得分:0)

是的,我通过部分使用@ John0987的建议来解决这个问题,因为我遇到的问题似乎比我让它复杂得多。基本上,这是一个hack,我将表格范围的布尔变量初始化为false并处理DataGridView的DataBindingComplete事件,该事件将布尔值设置为true,并在使行不可见之前在CellValueChanged事件中添加布尔检查。到目前为止,这完美无缺。