2010-05-25 69 views
5

我在我的屏幕上有一個列表框(MyListBox)和一個文本框(MyTextBox)。Winforms,數據綁定,列表框和文本框

ListBox中充滿了List(Of T),這些都是自定義項目。

現在我試着這樣做:

的ListBox的數據源是List(Of T)已。

現在,當一個項目的變化,我希望文本框被更新到我的列表框中選定的項目的特定屬性。

在代碼中,這意味着:

Me.MyListBox.DisplayMember = "SelectionName" 
Me.MyListBox.ValueMember = "Id" 

MyTextbox.DataBindings.Add(New Binding("Text", Me._listOfItems, "SelectedItem.Comment", True, DataSourceUpdateMode.OnPropertyChanged)) 

Me.MyListBox.DataSource = Me._listOfItems 

這不起作用。但是當我綁定到SelectedValue而不是SelectedItem時,它可以很好地工作。

_listOfItems被聲明爲這樣的:

Dim _listOfItems As List(Of MyItem) = New List(Of MyItem)() 

哪裏MyItem是這樣的:

public class MyItem 
{ 
    public string SelectionName { get; set; } 
    public int Id { get; set; } 
    public string Comment { get; set; } 
} 

我試圖重寫ToString()MyItem,這樣它會利用這一點。但那也行不通。

有人在乎試試看嗎?

謝謝!

-Snakiej

回答

9

其中一個最簡單的方法,我想,是使用一個BindingSource,設計將其設置爲ListBox.DataSource屬性爲您BindingSource

  1. 在表單上放一個BindingSource;
  2. 將您的ListBox.DataSource屬性設置爲您的BindingSource;
  3. 設置您的ValueMemberDisplayMember屬性,就像您實際在做的一樣;
  4. 使您的DataBinding爲您的TextBox控制,並使用您的BindingSource作爲來源,使用您的MyItem.Comment屬性;
  5. 指定您的List(Of MyItem)``to your Binding.DataSource`屬性;
  6. 您的文本框應該遵循CurrencyManager.CurrentItem的Comment屬性,即當前的ListBox.SelectedItem

的確,您可能需要實施INotifyPropertyChanged接口才能使其正常工作。

但是,如果這一切都與SelectValue完美配合,那麼爲什麼不使用它呢?

+0

SelectedValue是Id,我需要評論。我不能用它來調用數據庫:)我會嘗試你的解決方案! – Snake 2010-05-25 13:05:13

+0

我懂了!你是對的,如果你想要給用戶提供一個選擇選擇,我們不要用Id來做。= P – 2010-05-25 13:06:44

+0

選項5不需要:)和選項4:我使用此綁定: 新的綁定(「Text」,bindingSource1,「Comment」,...),因爲它已經使用bindingSource的.Current屬性! 謝謝! – Snake 2010-05-25 13:13:07