我有一个带有两个文本框列和一个组合框列的 datagridview。组合框的数据源绑定(bind)到下拉列表值的枚举。 datagridview的DataSource绑定(bind)到一个自定义类,数据类型为string、string和enum。
前两列预先填充了值,在第三列中,用户必须从下拉列表中选择一个值。到目前为止,所有这些都运行良好,除了......
组合框字段应该是一对一的映射,这意味着两个组合框不应具有相同的值。我真的不知道如何实现这种行为。是否应该从剩余的下拉列表中删除所选值?所选值是否应该保留在下拉列表中,并且在选择两个相同值时仅给出错误?
任何想法以及如何实现这些想法都会有很大的帮助。
谢谢
注意唯一可以多次使用的可接受值是“None”
最佳答案
根据您的意图,我有一个想法,可能会从剩余的下拉列表中删除所选的值。
我有一个名为 Runner
的类,它的设置与您的示例类似。
Public Class Runner
Public Property FirstName As String
Public Property LastName As String
Public Property Placement As Result
Public Sub New(fn As String, ln As String)
FirstName = fn
LastName = ln
Placement = Result.None
End Sub
End Class
我还有一个名为 Result
的枚举,它将填充到 ComboBoxCell
中:
Public Enum Result
None = 0
Bronze = 1
Silver = 2
Gold = 3
End Enum
当我创建数据对象并将它们绑定(bind)到 DataGridView
时,我这样做(注意 - Placements 是一个全局 List(Of Result),Runners 是一个全局 List(Of Runner)):
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Placements.Add(Result.None)
Placements.Add(Result.Bronze)
Placements.Add(Result.Silver)
Placements.Add(Result.Gold)
Runners.Add(New Runner("John", "Smith"))
Runners.Add(New Runner("Jane", "Doe"))
Runners.Add(New Runner("Bill", "Jones"))
Column1.DataPropertyName = "FirstName"
Column2.DataPropertyName = "LastName"
Column3.DataPropertyName = "Placement"
Column3.DataSource = Placements
DataGridView1.DataSource = Runners
End Sub
现在,只要 ComboBoxColumn
中的单元格值发生更改,您就可以从包含枚举的列表中删除新值:
Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
If (e.RowIndex > -1 And e.ColumnIndex = 2) Then
Dim currentvalue As Result = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
If currentvalue <> Result.None Then
Placements.Remove(currentvalue)
End If
End If
End Sub
更改下拉选择时要小心...按照此 Discussion ,您必须在 ComboBox
值更改后立即欺骗 DataGridView
提交值。我使用了该讨论中的答案并做了类似的事情:
Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
Dim col As DataGridViewColumn = DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex)
If col.Name = "Column3" Then
DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
Dim selected As DataGridViewCell = DataGridView1.CurrentCell
DataGridView1.CurrentCell = Nothing //This line and the next one simply hide
DataGridView1.CurrentCell = selected //an odd display effect that occurs
//because we remove a value and change the
//selection at the same time
End If
End Sub
最后,您需要处理 DataGridView
的 DataError
事件并将其留空,这样就不会抛出 Exceptions
从枚举列表中删除值时。
这可以让你完成大约 90% 的任务。当您更改值时,它不会将项目重新添加到列表中。例如,如果我从金级更改为银级,则金级应添加回列表中。您可能可以找出要处理哪些事件来获取旧值和新值,并根据其枚举值将旧值插入到列表中正确的索引处。
关于VB.NET datagridview 与组合框的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862667/