ComboBox DataBinding DisplayMember和LINQ查询

时间:2009-04-07 15:02:08

标签: vb.net linq combobox

更新

我决定遍历Data.DataTable并修剪那里的值。


利用SirDemon's帖子,我稍微更新了代码:

Sub test(ByVal path As String)
    Dim oData As GSDataObject = GetDataObj(path)
    EmptyComboBoxes()
    Dim oDT As New Data.DataTable
    Try
        Dim t = From r In oData.GetTable(String.Format("SELECT * FROM {0}gsobj\paths ORDER BY keyid", AddBS(path))) Select r

        If t.Count > 0 Then
            oDT = t.CopyToDataTable
            For Each dr As Data.DataRow In oDT.Rows
                dr.Item("key_code") = dr.Item("key_code").ToString.Trim
                dr.Item("descript") = dr.Item("descript").ToString.Trim
            Next
            dataPathComboBox.DataSource = oDT
            dataPathComboBox.DisplayMember = "descript"
            dataPathComboBox.ValueMember = "key_code"
            dataPathComboBox.SelectedIndex = 0
            dataPathComboBox.Enabled = True
        End If
    Catch ex As Exception

    End Try
End Sub

这几乎就像我需要的那样,数据最初来自foxpro表,因此它返回的字符串是<value>加上(<Field>.maxlength-<value>.length)尾随空白字符。例如,长度为12个字符的字段的值为bob。当我查询数据库时,我得到“bob_________”,其中_是一个空格。

我尝试了几种不同的东西来摆脱空白,例如:

  

dataPathComboBox.DisplayMember.Trim()
  dataPathComboBox.DisplayMember = "descript".Trim

但还没有任何效果。除了遍历Data.DataTable或创建自定义CopyToDataTable方法之外,我有什么办法可以修剪这些值吗?也许它可以与LINQ查询一起完成?


这是我到目前为止的代码,查询数据库并获取信息没有问题,但我无法弄清楚如何在ComboBox列表中显示正确的文本。我总是得到System.Data.DataRow

Try
    Dim t = From r In oData.GetTable("SELECT * FROM ../gsobj/paths ORDER BY keyid") _
            Select r

    dataPathComboBox.DataSource = t.ToList
    dataPathComboBox.SelectedIndex = 0
    'dataPathComboBox.DisplayMember = t.ToList.First.Item("descript")
    dataPathComboBox.Enabled = True
Catch ex As Exception
    Stop
End Try

我知道在DisplayMember行上.First.Item()部分是错误的,我只想显示我想要指定为DisplayMember的行。

3 个答案:

答案 0 :(得分:1)

我很确定你的代码试图将整个DataRow设置为一个属性,该属性只是Field(在强类型类中)或Column(在DataTable中)的名称。

dataPathComboBox.DisplayMember = "descript"

如果DataTable包含该名称的检索列,则应该有效。

此外,我建议您在完成DataBinding之后设置SelectedIndex,并且您知道实际上有项目,否则SelectedIndex = 0可能会抛出异常。

编辑:修剪绑定列的名称将修剪它,而不是实际的绑定值字符串。您必须在绑定后检查所有项目并执行以下操作:

dataPathComboBox.Item[i].Text = dataPathComboBox.Item[i].Text.Trim()

对于每个项目。不确定您正在使用的ComboBox控件,因此项集合名称可能是其他名称。

如果ComboBox控件暴露了某种类型的onItemDataBound事件,则另一个解决方案就是绑定每个项目。

还有很多其他方法可以做到这一点,具体取决于控件本身提供的内容以及您选择做什么。

答案 1 :(得分:0)

DisplayMember用于指示包含要显示的值的属性的名称。

在你的情况下,我不确定语法是什么,因为你好像在使用DataSet,但那应该是

... DisplayMember="Item['descript']"  ...

在Xaml中,除非您需要在运行时切换它,在这种情况下,您可以使用

在代码中执行此操作
dataPathComboBox.DisplayMember = "Item['descript']" 

同样,不是100%肯定语法。如果你使用的是强类型的DataSet,那就更容易了,因为你的行上应该有一个“descript”属性,但是给定的是你的错误表示“System.DataRow”而不是自定义类型,我想你不是。

答案 2 :(得分:0)

因为我无法找出您正在使用的数据源的基础类型,我建议您将注释字符串更改为

dataPathComboBox.DisplayMember = t.ElementType.GetProperties.GetValue(0).Name

并尝试在实践中确定正确的索引(最初为零)。