我正在尝试从DataSet填充ComboBox,而DataSet的一列也应填充TextBox。
示例表:
sid | sname | surl
---------------------------
1 | Google | www.google.com
2 | Bing | www.bing.com
3 | Yahoo | www.yahoo.com
现在我想将Google
,Bing
等作为ComboBox中的SelectedText
,而SelectedValue
是1
,2
等
当我选择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分配却由于转换错误而运行。
有什么建议吗?
答案 0 :(得分:2)
示例代码,以测试 BindingSource
和 Binding
类的功能。
使用一些字段构建DataTable(如问题中所提供);将数据表用作BindingSource
对象的数据源。
然后将BindingSource设置为ComboBox的数据源(此处为ComboBox1
)。
DisplayMember
和ValueMember
也设置为所需的字段(可能在分配控件的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