将DataSet填充到ComboBox中并填充TextBox

时间:2019-03-01 17:55:56

标签: vb.net winforms dataset

我正在尝试从DataSet填充ComboBox,而DataSet的一列也应填充TextBox。

示例表:

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

现在我想将GoogleBing等作为ComboBox中的SelectedText,而SelectedValue12
当我选择Google时,我想将www.google.com填充到文本框中。

代码:

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,最初的选择应该会起作用。
组合框选择Google并将TextBox1.Text设置为www.google.com
但是随后出现以下错误:

  

System.InvalidCastException:“类型为DataRowView的无效转换   输入整数。

这发生在SelectedIndexChanged事件中。
我真的不知道为什么第一个TextBox分配能很好地工作,而第二个TextBox分配却由于转换错误而运行。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

示例代码,以测试 BindingSource Binding 类的功能。

使用一些字段构建DataTable(如问题中所提供);将数据表用作BindingSource对象的数据源。

然后将BindingSource设置为ComboBox的数据源(此处为ComboBox1)。
DisplayMemberValueMember也设置为所需的字段(可能在分配控件的DataSource之前设置这些属性)。
然后,使用相同的DataSource(先前定义的Text对象)将Binding添加到TextBox BindingSource属性中。

当组合框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