Заполните DataSet в ComboBox и заполните TextBox - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь заполнить ComboBox из набора данных, в то время как столбец набора данных тоже должен заполнить текстовое поле.

Пример таблицы:

sid |  sname | surl
---------------------------
  1 | Google | www.google.com
  2 | Bing   | www.bing.com
  3 | Yahoo  | www.yahoo.com

Теперь я хочу Google, Bing и т. Д. Как SelectedText в ComboBox, в то время как SelectedValue равно 1, 2 и т. Д.
Когда я выбираю Google, я хочу заполнить www.google.comTextBox.

Код:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tb As DataTable = Dataset1.Table1

        ComboBox1.DataSource = tb
        ComboBox1.DisplayMember = "sname"
        ComboBox1.ValueMember = "sid"

        TextBox1.Text = DataSet1.Table1.FindBysid(ComboBox1.SelectedValue).surl
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        TextBox1.Text = DataSet1.Table1.FindBysid(ComboBox1.SelectedValue).surl
    End Sub
End Class

Afaik, начальный выбор работает как надо.
ComboBox выбирает Google и устанавливает TextBox1.Text в www.google.com.
Но затем возникает следующая ошибка:

System.InvalidCastException: «Недопустимое преобразование типа DataRowView в тип Integer.

Это происходит при событии SelectedIndexChanged.
Я действительно не знаю, почему первое назначение TextBox работает довольно хорошо, в то время как второе в событии выполняется с ошибкой преобразования.

Есть предложения?

1 Ответ

0 голосов
/ 01 марта 2019

Пример кода для проверки функциональности классов BindingSource и Binding.

Создайте таблицу данных с некоторыми полями (как указано в вопросе);используйте DataTable в качестве источника данных объекта BindingSource.

BindingSource затем устанавливается в качестве источника данных ComboBox (здесь ComboBox1).
DisplayMember и ValueMember также устанавливаются в требуемые поля (установите эти свойства, возможно, перед назначением источника данных элемента управления).
Затем добавьте Binding к свойству TextBox Text, используя тот же источник данных (ранее определенный объект BindingSource).

Когда ComboBox SelectedItem изменяется (в коде или из-за выбора пользователя), свойство TextBox.Text будет соответственно обновлено:

Friend bindingSource As BindingSource = Nothing

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim dt As New DataTable("TestTable")
    dt.Columns.AddRange({
        New DataColumn("sid", GetType(Integer)) With {
          .AutoIncrement = True, .AutoIncrementStep = 1, .AutoIncrementSeed = 1
        },
        New DataColumn("sname", GetType(String)),
        New DataColumn("surl", GetType(String))
    })

    dt.Rows.Add(New Object() {Nothing, "Google", "www.google.com"})
    dt.Rows.Add(New Object() {Nothing, "Bing", "www.bing.com"})
    dt.Rows.Add(New Object() {Nothing, "Yahoo", "www.yahoo.com"})

    bindingSource = New BindingSource(dt, "")

    ComboBox1.ValueMember = "sid"
    ComboBox1.DisplayMember = "sname"
    ComboBox1.DataSource = bindingSource

    TextBox1.DataBindings.Add(
        New Binding("Text", bindingSource, "surl", False, DataSourceUpdateMode.OnPropertyChanged))
    ComboBox1.SelectedIndex = 0
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...