VB.NET datagridview 与组合框的一对一映射

标签 vb.net winforms datagridview datagridcomboboxcolumn

我有一个带有两个文本框列和一个组合框列的 datagridview。组合框的数据源绑定(bind)到下拉列表值的枚举。 datagridview的DataSource绑定(bind)到一个自定义类,数据类型为string、string和enum。

前两列预先填充了值,在第三列中,用户必须从下拉列表中选择一个值。到目前为止,所有这些都运行良好,除了......

组合框字段应该是一对一的映射,这意味着两个组合框不应具有相同的值。我真的不知道如何实现这种行为。是否应该从剩余的下拉列表中删除所选值?所选值是否应该保留在下拉列表中,并且在选择两个相同值时仅给出错误?

任何想法以及如何实现这些想法都会有很大的帮助。

谢谢

注意唯一可以多次使用的可接受值是“None”

enter image description here

最佳答案

根据您的意图,我有一个想法,可能会从剩余的下拉列表中删除所选的值。

我有一个名为 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

最后,您需要处理 DataGridViewDataError 事件并将其留空,这样就不会抛出 Exceptions从枚举列表中删除值时。

这可以让你完成大约 90% 的任务。当您更改值时,它不会将项目重新添加到列表中。例如,如果我从金级更改为银级,则金级应添加回列表中。您可能可以找出要处理哪些事件来获取旧值和新值,并根据其枚举值将旧值插入到列表中正确的索引处。

关于VB.NET datagridview 与组合框的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862667/

相关文章:

vb.net - 生成随机字符串

.net - TabPages 中的工具条经常从 Windows 窗体设计器中消失

c# - 任何等效于 VB.net 函数名称作为 C# 中的返回值?

winforms - 如何在更新 Datagridview 时找到基础数据表中已更新的行?

c# - 如何创建 mysql 更新查询以在 c#.net windows 应用程序的一条语句中更新多行

javascript - OnClick 找不到我正在调用的子系统

.net - 免费语法突出显示 .NET 编辑器

c# - 获取一个Microsoft.VisualStudio.TextLogic版本14必须安装在GAC中

c# - 如何计算DataGridView.Rows.Height?

c# - DataGridView 中的 TimeSpan 选择器允许超过 24 小时