用ComboBox

时间:2018-04-25 11:29:09

标签: vb.net datagridview

This MSDN article建议可以使用您自己的数据更改自动生成的数据网格视图的内容,并重新绑定其中一个列,从而更改类型。它并没有完全描述如何。有许多类似于这个的问题,但是大多数问题基本上都指向MSDN源,并且没有真正的指示如何完全继续。最重要的是,很难清楚在自定义列中设置哪些属性以确保其工作方式与自动生成的列相同。 This question详述了类似的问题,但这个例子根本不是很小。

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

  1. 包含N列的数据库表。其中一列包含3个不同的值。假设它是一个整数列,可以包含0,1或2。
  2. 已绑定到所述数据库表作为数据源的DataGridView
  3. VB.NET本身会生成textbox列。由于这不是非常用户友好,我想用一个DataGridComboBoxColumn替换它。怎么会这样做呢?

1 个答案:

答案 0 :(得分:0)

this answer中所述,我设法创建了一个组合框列,并使用以下示例数据填充它的“选项”(此处以JSON格式列出);

[{"id": 0, "type": "never"},
 {"id": 1, "type": "always"}, 
 {"id": 2, "type": "sometimes"}]

假设我们绑定这样的数据(myOptions是一个返回上面数据的辅助类,作为两个类成员,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 必须与包含显示文本的列的名称匹配,才能为组合框选项提供用户。

使用选项列表(手动数据,因此组合框选项存储在数据库中时,示例中的这些选项成员(idtype) )必须实现为属性。在将自定义列添加到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