【问题标题】:ComboBox DataBinding DisplayMember and LINQ queries组合框数据绑定 DisplayMember 和 LINQ 查询
【发布时间】:2009-04-07 15:02:08
【问题描述】:

更新

我决定遍历 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 的行。

【问题讨论】:

    标签: vb.net linq combobox


    【解决方案1】:

    我很确定您的代码尝试将整个 DataRow 设置为一个属性,该属性只是字段(在强类型类中)或列(在 DataTable 中)的名称。

    dataPathComboBox.DisplayMember = "descript"
    

    如果 DataTable 包含该名称的检索列,则应该可以工作。

    另外,我建议您仅在完成 ​​DataBinding 并且知道您确实有项目之后设置您的 SelectedIndex,否则 SelectedIndex = 0 可能会引发异常。

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

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

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

    如果 ComboBox 控件公开某种类型的 onItemDataBound 事件,则另一种解决方案是在绑定每个项目时对每个项目执行此操作。

    还有很多其他方法可以做到这一点,具体取决于控件本身提供的功能以及您选择执行的操作。

    【讨论】:

    • 请注意,我的答案倾向于 C# 语法,我很长时间没有使用 VB。
    • 是的,我几乎可以在脑海中转换 C# -> VB.NET。不用担心^^。
    【解决方案2】:

    DisplayMember 旨在指示保存要显示的值的属性的名称。

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

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

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

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

    再说一次,语法不是 100% 确定的。如果您使用的是强类型数据集,则更容易,因为您的行上应该有一个“descript”属性,但鉴于您的错误指示“System.DataRow”而不是自定义类型,我猜您不是。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 2012-01-24
        相关资源
        最近更新 更多