ComboBox DataBinding DisplayMember и LINQ запросы - PullRequest
0 голосов
/ 07 апреля 2009

Обновление

Я решил перебрать Data.DataTable и обрезал там значения.


Используя сообщение SirDemon , я немного обновил код:

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 ]

1 голос
/ 09 апреля 2009

Я почти уверен, что ваш код пытается установить для целого DataRow свойство, которое представляет собой просто имя поля (в классе со строгим типом) или столбца (в DataTable).

dataPathComboBox.DisplayMember = "descript"

Должно работать, если DataTable содержит извлеченный столбец с таким именем.

Кроме того, я бы предложил установить SelectedIndex только ПОСЛЕ того, как вы сделали привязку данных, и вы знаете, что у вас действительно есть элементы, в противном случае SelectedIndex = 0 может вызвать исключение.

РЕДАКТИРОВАТЬ: Обрезка имени связанного столбца будет обрезать только это, а не фактическую строку значения привязки. Вы должны либо просмотреть все предметы после их привязки и сделать что-то вроде:

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

За каждый из предметов. Не уверен, какой элемент управления ComboBox вы используете, поэтому имя коллекции элементов может быть другим.

Другое решение заключается в том, чтобы сделать это для каждого элемента, когда он связан, если элемент управления ComboBox предоставляет какое-либо событие onItemDataBound.

Существует множество других способов сделать это, в зависимости от того, что предлагает сам элемент управления и что вы решите сделать.

0 голосов
/ 09 апреля 2009

Поскольку я не могу определить базовый тип источника данных, который вы используете, я предлагаю вам изменить закомментированную строку на

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

и попробуйте на практике определить правильный индекс (изначально он равен нулю).

0 голосов
/ 07 апреля 2009

DisplayMember предназначен для указания имени свойства, содержащего значение для отображения.

В вашем случае я не уверен, какой будет синтаксис, поскольку вы, похоже, используете DataSet, но это должно быть

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

в Xaml, если вам не нужно переключать это во время выполнения, и в этом случае вы можете сделать это в коде с помощью

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

Опять же, не уверен на 100% в синтаксисе. Если вы используете строго типизированный DataSet, это еще проще, поскольку в вашей строке должно быть свойство "descript", но, учитывая, что ваша ошибка указывает на "System.DataRow", а не на пользовательский тип, я полагаю, что это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...