【发布时间】:2019-03-21 19:29:43
【问题描述】:
我有一个DataGridView,它使用BindingSource 绑定到DataTable,并不是DataGridView 中的所有列都绑定到DataSource 的属性。更具体地说,我有一个自定义的DataGridViewColumn 用于多选,它派生自DataGridViewCheckBoxColumn 类,并且有一个主复选框来控制位于列标题中的其他复选框。我的问题是,每当DataTable.AcceptChanges 被调用时,DataGridViewCheckBoxCell 就会恢复为其默认值 (False),并且我会丢失之前的选择。有谁知道防止或避开这种行为的好方法?
基本上,即使在调用 DataTable.AcceptChanges 之后,我也希望保留该列中的单元格值,因为它们与基础数据源无关。
这里是一些重现我所经历的示例代码。选中选择列中的一些复选框并按Ctrl+S 并注意您每次都会丢失这些检查,即使它们未绑定到特定的DataGridViewColumn。我意识到这可能是BindingSource 的本质,但我想知道是否有办法解决这种行为。另外,我想避免编写逻辑来保存在调用AcceptChanges 之前选择的行,然后在AcceptChanges 返回之后重置它们。对我来说,如果我们一次在DataGridView 中选择了大量行,这似乎太麻烦了。有人有更骇人听闻的想法吗?
Public Class Form1
Sub New()
InitializeComponent()
Dim dgv As New DataGridView
dgv.Columns.Add(New DataGridViewCheckBoxColumn With {.HeaderText = "Selection"})
dgv.Columns.Add(New DataGridViewTextBoxColumn With {.HeaderText = "ChangeMe", .DataPropertyName = "ChangeMe"})
Controls.Add(dgv) : dgv.Dock = DockStyle.Fill
Dim dt = New DataTable : dt.Columns.Add("ChangeMe", GetType(String))
For Each thing In {"Shoe", "Boat", "Rat"} : dt.Rows.Add(thing) : Next
dgv.DataSource = New BindingSource(dt, Nothing)
Me.KeyPreview = True
AddHandler Me.KeyDown, Sub(sender As Object, e As KeyEventArgs)
If e.Control AndAlso e.KeyCode = Keys.S Then dt.AcceptChanges()
End Sub
End Sub
End Class
【问题讨论】:
标签: vb.net winforms datagridview datatable bindingsource