如何重新绑定winforms中的组合框?

问题描述:

我有一个Winforms应用程序,并且当窗体加载时,组合框的数据源设置为DataTable。数据在组合框中显示得很好。如何重新绑定winforms中的组合框?

然后,当用户点击一个按钮后,我想创建一个新的DataTable并将该数据表分配为ComboBox的数据源。

问题是,将数据源设置为新的数据表后,组合框中的项不会更改。这是我正在使用的代码。

dlCustomer.DataSource = Nothing 
     dlCustomer.DataSource = dtCustomers 
     dlCustomer.DisplayMember = "Name" 
     dlCustomer.Refresh() 

有谁知道如何使正确的数据显示在组合框第二次为它分配数据源?

+0

只是要仔细检查;你是在设计时绑定它吗?是绑定到一个绑定源,然后依次转换为数据表(默认设计器行为)还是直接在代码中完成的绑定到DataTable? – STW 2009-05-04 23:09:03

它应该工作,至少它在我把它扔在一起的快速测试中。这是代码;它只是期望一个窗体与组合框和按钮:

Public Class Form1 

     Private dtOne As DataTable 
     Private dtTwo As DataTable 

     Private Sub InitializeTables() 
      dtOne = New DataTable("TableOne") 
      With dtOne 
       .Columns.Add("Text", GetType(String)) 
       .Columns.Add("Value", GetType(Integer)) 
      End With 

      dtTwo = New DataTable("TableTwo") 
      With dtTwo 
       .Columns.Add("Text", GetType(String)) 
       .Columns.Add("Value", GetType(Integer)) 
      End With 

      Dim newRow As DataRow 
      For index As Integer = 0 To 2 
       newRow = dtOne.NewRow 
       newRow.ItemArray = (New Object() {SpellIt(index), index}) 
       dtOne.Rows.Add(newRow) 
      Next 

      For index As Integer = 2 To 0 Step -1 
       newRow = dtTwo.NewRow 
       newRow.ItemArray = (New Object() {SpellIt(index), index}) 
       dtTwo.Rows.Add(newRow) 
      Next 

      dtOne.AcceptChanges() 
      dtTwo.AcceptChanges() 

     End Sub 

     Private Shared Function SpellIt(ByVal int As Integer) As String 
      Select Case int 
       Case 0 : Return "Zero" 
       Case 1 : Return "One" 
       Case 2 : Return "Two" 
       Case Else : Throw New ArgumentOutOfRangeException("Bleh!") 
      End Select 
     End Function 

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

      Me.Label1.DataBindings.Add("Text", ComboBox1, "SelectedValue") 

      Me.ComboBox1.DataSource = dtOne 
      Me.ComboBox1.DisplayMember = "Text" 
      Me.ComboBox1.ValueMember = "Value" 

     End Sub 

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
      Me.ComboBox1.DataBindings.Clear() 
      Me.ComboBox1.DataSource = Nothing 

      Me.ComboBox1.DataSource = dtTwo 
      Me.ComboBox1.DisplayMember = "Text" 
      Me.ComboBox1.ValueMember = "Value" 

     End Sub 

    End Class