2016-01-13 74 views
1

我有一個小數據綁定(可能是愚蠢的)問題。我嘗試綁定一個列表綁定列表<Double>到WinForms列表框

List<double> _measuredValues = new List<double>(); 

到一個winforms ListBox。

在我的Form_Load設置:

lstMeasuredValues.DataSource = _measuredValues; 

當我更新值,會出現什麼?

_measuredValues.Add(numBuffer); 

我想過的一件事是數據類型問題。但是,如何改變類型以將其更改爲字符串?

lstMeasuredValues.DataSource = _measuredValues.ToString().ToList(); 

另一個原因可能是上面的代碼行在另一個線程內。但我認爲這不應該是問題。

我該如何綁定這個列表?

回答

3

當我更新的值,什麼都沒有出現?!

_measuredValues.Add(numBuffer);

爲了允許UI反映數據源修改,數據源必須提供某種更改通知。 WinForms列表數據綁定基礎結構使用IBindingList InterfaceListChanged event。有一個標準BindingList<T> class可以用來代替List<T>來獲得所需的行爲。你需要的是改變這一行

List<double> _measuredValues = new List<double>(); 

BindingList<double> _measuredValues = new BindingList<double>(); 

另一個原因可能是代碼的上面一行是另一個線程中。但我認爲這不應該是問題。

這並不好。您必須請確保您不這樣做,因爲ListChanged事件預計會在UI線程中引發。

+0

嗯,你是對的。只有在調用UI線程時添加新值,才能使用BindigList。所以非常感謝。我想過線程安全的控制調用,但錯過了事實,即事件將停留在調用者線程內。現在它可以和BindingList一起工作。 – AllDayPiano

0

所有你需要做的是更新後刷新列表:

lstMeasuredValues.Refresh(); 
+0

謝謝你的回答。恐怕這沒有幫助:/ – AllDayPiano

1

你可以使用一個BindingList<double>爲您的列表框的數據源

List<double> _measuredValues = new List<double>(); 
BindingList<double> bindList = new BindingList<double>(_measuredValues); 
lstMeasuredValues.DataSource = bindList; 

現在,每當你需要添加元素的使用bindList變量和您的列表框將自動更新以及您的_measuredValues列表

3

更好的方法是清除項目並分配t他的DataSource再次:

lstMeasuredValues.Items.Clear()// clear all items 
lstMeasuredValues.DataSource = _measuredValues; 

甚至可以定義自己的刷新功能,並呼籲像下面這樣:

public void RefreshList() 
{ 
    lstMeasuredValues.Items.Clear()// clear all items 
    lstMeasuredValues.DataSource = _measuredValues; 
} 

,並呼籲他們當過你需要刷新列表:

_measuredValues.Add(numBuffer); 
RefreshList(); 
// Add more values 
RefreshList(); 
1

最簡單的方法之一是通過把:

lstMeasuredValues.DataSource = null; //the cheapest, trickiest, but the most important line 
lstMeasuredValues.DataSource = _measuredValues; 

每當您的_measuredValues元素更新時

+0

它基本上是像這裏所有人推薦的相同的解決方案,但它是最短的:) – AllDayPiano

+0

@AllDayPiano真實,我最喜歡它。 =),因爲這在我看來是最簡單的。 – Ian

+0

我在過去使用過這個解決方案,但是我擔心刪除並重新設置列表框的數據源的未知副作用,正如此答案的評論中所述:http://stackoverflow.com/a/16695962/1211380 – LucaMus

2

問題是常見的List不是數據綁定的正確選擇。如果你想保持更新列表框,你應該使用BindingList。現在

BindingList<double> bindList = new BindingList<double>(_measuredValues); 
lstMeasuredValues.DataSource = bindList; 

請記住,當你在_measuredValues添加一個新的項目,你必須手動刷新綁定,至於我,就像這樣:

嘗試使用這種方式

bindList.ResetBindings();