2009-05-04 19 views
3

私はWinformsアプリケーションを持っていて、コンボボックスにはフォームがロードされるときにDataTableに設定されたデータソースがあります。データはコンボボックスでうまく表示されます。winformsでコンボボックスを再バインドするにはどうすればよいですか?

ユーザーがボタンをクリックした後、新しいDataTableを作成し、そのデータテーブルをコンボボックスのデータソースとして割り当てる必要があります。

問題は、データソースを新しいデータテーブルに設定した後、コンボボックス内の項目が変更されないということです。ここで私が使用しているコードです。

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

誰かが正しいデータをコンボボックスに表示する方法を知っていますか?2度目にデータソースを割り当てますか?

+0

あなたはそれをデザイン時にバインドしていますか?バインディングソースにバインドされていて、データテーブル(デフォルトのデザイナービヘイビア)にバインドされているか、コード内でDataTableに直接バインドされていますか? – STW

答えて

4

それは動作するはずです、少なくともそれは一緒に投げた簡単なテストでした。ここにコードがあります。コンボボックスとボタン付きのフォームが必要です:

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 
関連する問題