Почему я не могу получить выбранное значение? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть два ComboBox для Employee & PayrollName.на первом ComboBox ('PayrollName') использование SelectedValue нормально, но когда дело доходит до следующего ComboBox, я получаю эту ошибку:

Преобразование из типа 'VB $ AnonymousType_11 (Of Integer, String) 'для ввода' Integer 'недопустимо

Я пытался найти ошибку, но не повезло, я не могу найти даже один

Мой коддля загрузки данных в мой Employee ComboBox

Dim _list = MyContext.Employees.Where(Function(q) q.Status = True).Select(Function(q) New With
                                                   {
                                                   q.EID,
                                                   .Name = q.Lastname & ", " & q.Firstname
                                                   }).ToList
        Dim list = _list.OrderBy(Function(x) x.Name).ToList()
        With cbxEmployee
            .DataSource = list.ToList
            .DisplayMember = "Name"
            .ValueMember = "EID"
        End With

Мой код для получения SelectedValue

Dim EmployeeID As Integer = cbxEmployee.SelectedValue

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Первый оператор в коде включает следующее лямбда-выражение:

Function(q) New With
   {
   q.EID,
   .Name = q.Lastname & ", " & q.Firstname
   }

Он генерирует анонимный тип с полем Integer (EID) и полем String (Name).Это VB$AnonymousType_11(Of Integer,String), которое вы видите в сообщении об ошибке.Эти значения назначаются комбинированному списку, и поэтому, когда вы смотрите на SelectedValue для ComboBox, это тип значения, с которым вы работаете.

Так что вам нужно сделать следующее:

Dim EmployeeID As Integer = cbxEmployee.SelectedValue.EID

ДАЖЕ ЛУЧШЕ

Это работает только потому, что Option Strict выключен, а очень плохо .Это приводит ко всем видам ошибок времени выполнения.Вы должны включить Option Strict.Это может вызвать кучу новых ошибок в вашем коде, но каждая из них на самом деле - небольшая бомба замедленного действия, ожидающая взлета.Это дает вам возможность исправить эти ошибки сейчас, прежде чем они вызовут проблему для ваших пользователей.Вы получите лучший, более быстрый код, который легче поддерживать.

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

Public Class EmployeeListItem
    Public Property EID As Integer
    Public Property Name As String
End Class

Тогда я быдалее установите элементы DisplayMember и ValueMember перед назначением источника данных.Объедините с другими исправлениями, и вы получите следующее:

Dim list = MyContext.Employees.
        Where(Function(q) q.Status = True).
        Select(Function(q) New EmployeeListItem With
                {
                    q.EID,
                    .Name = q.Lastname & ", " & q.Firstname
                 }).
        OrderBy(Function(x) x.Name)

With cbxEmployee
    .DisplayMember = "Name"
    .ValueMember = "EID"
    .DataSource = list
End With

Обратите внимание, мне никогда не приходилось звонить ToList().Это уменьшает использование памяти, и в некоторых случаях может сделать код значительно более эффективным.

Затем, при использовании значения, вы хотите привести его, например:

Dim EmployeeID As Integer = DirectCast(cbxEmployee.SelectedValue, EmployeeListItem).EID
0 голосов
/ 20 ноября 2018

Попробуйте включить Option Strict.SelectedValue не является целым числом и не может быть непосредственно вставлено в целое число.В этом случае он возвращает объект AnonymousType, который вы создали.Вам нужно будет решить .Name или .EID

...