Vb.net 用组合框替换绑定的DataGridView列

Vb.net 用组合框替换绑定的DataGridView列,vb.net,datagridview,Vb.net,Datagridview,建议您可以使用自己的数据更改自动生成的数据网格视图的内容,并重新绑定其中一列,从而更改类型。但它并没有准确描述如何进行。有许多问题与此类似,但大多数问题本质上都指向MSDN源代码,没有真正的指针指示如何准确地进行。最重要的是,为了确保自定义列的工作方式与自动生成列的工作方式相同,在自定义列中设置哪些属性是相当不清楚的。详细介绍了一个类似的问题,但是这个例子并不是很简单 让我们假设我们有以下内容(作为最低限度的示例): 包含一些N列的数据库表。其中一列包含3个不同的值。假设它是一个整数列,可以包含

建议您可以使用自己的数据更改自动生成的数据网格视图的内容,并重新绑定其中一列,从而更改类型。但它并没有准确描述如何进行。有许多问题与此类似,但大多数问题本质上都指向MSDN源代码,没有真正的指针指示如何准确地进行。最重要的是,为了确保自定义列的工作方式与自动生成列的工作方式相同,在自定义列中设置哪些属性是相当不清楚的。详细介绍了一个类似的问题,但是这个例子并不是很简单

让我们假设我们有以下内容(作为最低限度的示例):

  • 包含一些N列的数据库表。其中一列包含3个不同的值。假设它是一个整数列,可以包含0、1或2
  • 作为数据源绑定到所述数据库表的
    DataGridView
    VB.NET本身将生成一个
    textbox
    列。由于这对用户不是很友好,我想用DataGridComboxColumn来代替它。一个人怎么做呢

    如中所述,我成功地创建了一个组合框列,并用以下示例数据(此处以JSON格式列出)填充它所拥有的“选项”

    假设我们像这样绑定数据(myOptions是一个helper类,返回上面的数据,作为两个类成员,id和type)。假设数据库表列名为“hasOption”:

    myDataGridView.Columns.Remove("hasOption")
    Dim newColumn As New DataGridViewComboBoxColumn()
    newColumn.DataSource = myOptions.GetChoices()
    newColumn.DataPropertyName = "hasOption"
    newColumn.ValueMember = "id"
    newColumn.DisplayMember = "type"
    newColumn.Name = "hasOption"
    myDataGridView.Columns.Add(newColumn)
    
    这里的重要事实是:

    DataPropertyName必须与数据源列名(数据库表列名)完全匹配

    ValueMember必须与包含组合框选项值(ID)的列的名称匹配

    DisplayMember必须与组合框选项中包含显示文本的列的名称相匹配

    使用选项列表时(手动数据,因此组合框选项不存储在数据库中),这些选项成员(
    id
    在示例中键入
    )必须实现为属性。在将自定义列添加到
    DataGridView
    时,仅使用公共类成员会导致一个奇怪的错误

    值成员类的实现方式如下:

    Public Class myOptions
    Public Property type As String
    Public Property id As Integer
    Public Sub New(ByVal nType As String, ByVal nID As Integer)
        type = nType
        id = nID
    End Sub
    
    Private Shared allValues As List(Of myOptions) = New List(Of myOptions) From {
        New myOptions("never", 0),
        New myOptions("always", 1),
        New myOptions("sometimes", 2)
    }
    
    Public Shared Function GetChoices() As List(Of myOptions)
        Return allValues
    End Function
    End Class
    
    Public Class myOptions
    Public Property type As String
    Public Property id As Integer
    Public Sub New(ByVal nType As String, ByVal nID As Integer)
        type = nType
        id = nID
    End Sub
    
    Private Shared allValues As List(Of myOptions) = New List(Of myOptions) From {
        New myOptions("never", 0),
        New myOptions("always", 1),
        New myOptions("sometimes", 2)
    }
    
    Public Shared Function GetChoices() As List(Of myOptions)
        Return allValues
    End Function
    End Class