我无法动态地将一个组合框列添加到我的datagridview中(在你问之前,是的,它必须是动态的,而不是在编辑器中完成)。
主要特征是每行的组合框单元格不同,因此必须使用组合框单元格完成。 checkedRows是一个数据表。
datagridview的名称是editCameraTable。此时它已经有几列:
'create new column
Dim resComboColumn As New DataGridViewComboBoxColumn _
With {.HeaderText = "Resolution", .ReadOnly = False, .DisplayIndex = 7, .Name = "Resolution", _
.DisplayMember = "Name", .ValueMember = "ID", .DataPropertyName = "ID"}
'add combo box column
EditCameras.editCameraTable.Columns.Insert(17, resComboColumn)
addResCmbBox(checkedRows, resComboColumn)
非常直接。您会注意到我有值成员,dataproperty名称等。这里是addResCmbBox定义:
Public Function addResCmbBox(ByRef DT As DataTable, column As DataGridViewComboBoxColumn)
Dim resolutions As String()
'for each camera
For i As Integer = 0 To DT.Rows.Count - 1
Dim camera As camera = convertDTtoCam(DT, i)
'get the resarray
Select Case DT.Rows(i).Item("Maker").ToString.ToLower
Case "acti"
resolutions = ACTi.GetResArray(camera)
Case Else
resolutions = ACTi.GetResArray(camera)
End Select
'add items to combobox list
Dim comboCell As New DataGridViewComboBoxCell
comboCell.DataSource = resolutions
For j As Integer = 0 To resolutions.Length - 1
'set to current resolution value
If resolutions(j).TrimStart("N") = camera.res Then
comboCell.Value = resolutions(j)
End If
Next
comboCell.DisplayMember = "Name"
comboCell.ValueMember = "ID"
EditCameras.editCameraTable("Resolution", i) = comboCell
Next
Return Nothing
End Function
相机是一种结构。在我到达displayMember和value成员问题之前,我没有问题,即以" editcameras.editcameratable ..."开头的最后一行。
这样做时,"字段名称的例外不存在"弹出。如果我没有指定displayMember和valueMember,我没有问题。但是,我无法获得在comboBox中选择的值(它返回为Null)。在运行时,组合框列的值成员和显示名称为" ID"和"姓名"。
如何将此组合框结合到行中,以便以后可以获得它的选定值?
更新:
我按照评论的方式做了,并创建了一个结构/类,它应该是解析属性:
Public Class ResolutionStruct
Property Name As String
Property ID As String
End Class
在循环中,我创建了这个类的列表,并为其赋值:
Dim resolutionList As New List(Of ACTi.ResolutionStruct)
For j As Integer = 0 To resolutions.Length - 1
Dim resClass As New ACTi.ResolutionStruct
resClass.Name = resolutions(j)
resClass.ID = resolutions(j)
resolutionList.Add(resClass)
Next
'set combocell values
comboCell.DisplayMember = "Name"
comboCell.ValueMember = "ID"
comboCell.DataSource = resolutionList
EditCameras.editCameraTable("Resolution", i) = comboCell
但是,当它降低时,comboboxCell不会显示任何值。所以,现在我已经限制了价值观,但它没有显示任何内容。还有什么我应该这样做,以便我得到两个神圣的组合,看到我挑选的价值并将它们绑定到数据网格视图? :d
更新2 所以,mea culpa。我正在将组合框细胞添加到错误的列中!
现在,它正在展示价值观。我单击一个值,并尝试将所选值作为字符串抓取:
Dim cmbbox2 As DataGridViewComboBoxCell = editCameraTable("Resolution", i)
resolution(i) = cmbbox2.Selected.ToString()
但它仍然说它是一个空值!中期构建我检查了组合框道具。实际上"选择"是一个布尔值为false。它没有任何价值,说它没有任何物品。关于它为什么说它是空的任何想法?
UPDATE3 :
我最近在表格中使用了不同的列,并清除了组合框中的值!我想它一开始并没有被附加/束缚。
UPDATE4 :
修正了!!
显然这一行: editCameraTable.Sort(editCameraTable.Columns(" ID"),System.ComponentModel.ListSortDirection.Ascending)
导致桌子吓坏了!我现在可以得到价值(哇哦!)
答案 0 :(得分:1)
是的,我会尽快解释一下:
应该使用属性设置DisplayMember和ValueMember。例如,您创建一个包含名称和ID
的类Public Class Test
Property Name as String
Property ID as String
End Class
创建一些这些对象并将它们放在一个列表中。将列表设置为组合框的数据源。现在您可以访问DisplayMember和ValueMember,就像在代码中编写它一样。值将是ID,SelectedItem将是整个类。
您现在正在做的是您要在组合框中添加字符串列表。 String不包含Property Name或ID,因此您无法获取它们。看到这样:
为了能够使用Value和/或DisplayMember,您需要自己获取属性。在这种情况下:
resolutions(j).Name
or
resolutions(j).ID
这不起作用。
但是例如你可以这样做:
resolutions(j).Length
所以你可以这样做,这将在组合框中显示长度:
Combobox.DisplayMember = "Length"
要获得您必须执行的值:
Combobox.SelectedItem.ToString()
但是,因为你在组合框中有它我的猜测是,由于你无法从DataGridView中获取值,所以不会删除它。
编辑:你还在做这个吗?
<DataGridView>.Item("Resolution", i) = comboCell
否则你将有空的组合框。
EDIT2:无需从Combobox获取值,而是从Grid小区获取它:
<DataGridView>.Item("Resolution", i).Value
创建列时不要忘记为组合框设置defaultvalue,否则它可能是Nothing:
comboCell.DisplayMember = "Name"
comboCell.ValueMember = "ID"
comboCell.Value = resolutions(0)