我有datagridview
绑定到List(of T)
。
Private BodyComponents As New List(Of BodyComponent)
Private BodyBinding As BindingSource
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Set the bindingsource
BodyBinding = New BindingSource(BodyComponents, Nothing)
' Add any initialization after the InitializeComponent() call.
dgvBodyOverview.DataSource = BodyBinding
....
列表中的所有项目都代表具有多个属性的对象,其中一个属性为材质As String
。我有一个很大的可用材料列表,用户应该可以从中选择。如何在datagridview
下拉框中提供此功能?
信息:打开对话框时,在运行时读取材料,而不是硬编码。
答案 0 :(得分:1)
您无法更改列类型,因此在创建列后,将Material
替换为您创建的新DataGridViewComboBoxColumn
:
dgv1.DataSource = ...
Dim cbo = New DataGridViewComboBoxColumn()
Dim oldCol = dgv1.Columns("Material")
' copy or set prop values
cbo.HeaderText = oldCol.HeaderText
cbo.Name = oldCol.Name
cbo.DataSource = MaterialsList
cbo.DataPropertyName = "Material"
' replace the column
dgv1.Columns.Remove(oldCol)
dgv1.Columns.Add(cbo)
' cant set the Display Index until it is in the DGV
cbo.DisplayIndex = oldCol.DisplayIndex
如果你需要列显示一件事但是将类似Id的内容保存到DGV的DataSource
,你可以通过组合列的DataSource
来实现。
使用包含DataTable
的{{1}}查询结果和您要显示的文字,或使用简单Id
这些名称 - 值对:
List
cbo.DataSource = Materials ' == a DT or List of Name-Id
cbo.DisplayName = "MaterialName" ' col or prop name to show
cbo.ValueMember = "Id" ' value to save
的数据类型需要与它在数据源中映射到的列的数据类型相匹配(ValueMember
)