Почему я получаю System.InvalidCastException при использовании комбинированного списка для изменения последовательных портов? VB.NET 2019 - PullRequest
0 голосов
/ 13 апреля 2019

Я создал переменную как новый последовательный порт, например:

Public Shared panelComm As New SerialPort("COM3")

Теперь, это продолжает давать мне это исключение при использовании комбинированного списка, который заполняется списком доступных COM-портов, чтобы попытаться изменить номер порта:

System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'System.IO.Ports.SerialPort'.'

Мой код, чтобы изменить это так:

panelComm.Close()
panelComm = panelCOMdrp.SelectedItem
panelComm.Open()

panelComm - это переменная порта, а panelCOMdrp - это выпадающий список со списком портов.

РЕДАКТИРОВАТЬ: Это код, который я использую для заполнения списка последовательных портов, доступных для программы:

For Each sp As String In My.Computer.Ports.SerialPortNames
      panelCOMdrp.Items.Add(sp)
Next

1 Ответ

0 голосов
/ 13 апреля 2019

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

Вы должны быть явным и создать экземпляр SerialPort из этой строки, и, следовательно, вы должны написать (каквы делаете, когда объявляете переменную)

' Always check if a selection is present or not
if panelCOMdrp.SelectedItem IsNot Nothing Then
    panelComm = New SerialPort(panelCOMdrp.SelectedItem.ToString())
End If

Замечание @ nbk в приведенном ниже комментарии верно, потому что SelectedItem определен для типа Object .Это определение вместе с конструкторами для SerialPort вызывает проблему.SerialPort имеет много перегрузок, и одна из этих перегрузок ожидает IContainer, а другая ожидает строку.Передача только SelectedItem (Object) заставляет компилятор выбирать конструктор, который ожидает IContainer, и это создает ошибку.Простое добавление ToString решит проблему, и будет выбран правильный конструктор.

...