无法将valuemember / display成员设置为绑定组合框

时间:2014-04-02 15:27:31

标签: vb.net datagridview combobox

我无法动态地将一个组合框列添加到我的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)

导致桌子吓坏了!我现在可以得到价值(哇哦!)

1 个答案:

答案 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)