2012-06-12 187 views
2

我有一個帶有ListBox的Windows窗體。窗體有這種方法Winforms綁定到列表框

public void SetBinding(BindingList<string> _messages) 
{ 
    BindingList<string> toBind = new BindingList<string>(_messages); 
    lbMessages.DataSource = toBind; 
} 

在其他地方,我有一類稱爲經理有此屬性

public BindingList<string> Messages { get; private set; } 

和這條線在其構造

Messages = new BindingList<string>(); 

最後,我有我的啓動程序,實例化窗體和管理器,然後調用

form.SetBinding(manager.Messages); 

還有什麼我必須這樣做,像這樣在經理聲明:

Messages.Add("blah blah blah..."); 

將導致添加到線,並在窗體的列表框立即顯示?

我根本沒必要這樣做。我只想讓我的經理類能夠在其工作時發佈到表單。

回答

3

我認爲問題出在您的SetBinding方法中,您正在製作新的綁定列表,這意味着您不再綁定到Manager對象中的列表。

儘量只傳遞當前的BindingList到數據源:

public void SetBinding(BindingList<string> messages) 
{ 
    // BindingList<string> toBind = new BindingList<string>(messages); 
    lbMessages.DataSource = messages; 
} 
+0

我試過了,但Manager中的Messages.Add語句不會更新lbMessages.DataSource;它的數量永遠不會從0移動。 –

+0

@KellyCline我試着儘可能地模仿你的代碼,當我在Manager類中彈出消息時,ListBox自動顯示新消息。確保你引用的是同一個Manager類。否則,您可能需要更新您的文章以獲取更多信息。 – LarsTech

1

添加一個新的WinForms項目。刪除一個列表框。原諒設計。只是想通過使用BindingSource和BindingList組合來證明它的工作原理。

使用的BindingSource是這裏的關鍵

Manager類

public class Manager 
{ 
    /// <summary> 
    /// BindingList<T> fires ListChanged event when a new item is added to the list. 
    /// Since BindingSource hooks on to the ListChanged event of BindingList<T> it also is 
    /// 「aware」 of these changes and so the BindingSource fires the ListChanged event. 
    /// This will cause the new row to appear instantly in the List, DataGridView or make any 
    /// controls listening to the BindingSource 「aware」 about this change. 
    /// </summary> 
    public BindingList<string> Messages { get; set; } 
    private BindingSource _bs; 

    private Form1 _form; 

    public Manager(Form1 form) 
    { 
     // note that Manager initialised with a set of 3 values 
     Messages = new BindingList<string> {"2", "3", "4"}; 

     // initialise the bindingsource with the List - THIS IS THE KEY 
     _bs = new BindingSource {DataSource = Messages}; 
     _form = form; 
    } 

    public void UpdateList() 
    { 
     // pass the BindingSource and NOT the LIST 
     _form.SetBinding(_bs); 
    } 
} 

Form1類

public Form1() 
    { 
     mgr = new Manager(this); 
     InitializeComponent(); 

     mgr.UpdateList(); 
    } 

    public void SetBinding(BindingSource _messages) 
    { 
     lbMessages.DataSource = _messages; 

     // NOTE that message is added later & will instantly appear on ListBox 
     mgr.Messages.Add("I am added later"); 
     mgr.Messages.Add("blah, blah, blah"); 
    } 
+0

另一個評論提供了一個修復,但我也想試試這個。謝謝! –

+0

'典型的解決方案程序員將使用提供數據綁定功能的類,例如** BindingSource **,而不是直接使用BindingList 。閱讀備註部分 - http://msdn.microsoft.com/en-us /library/ms132679.aspx –