[英]Bind List<Double> to WinForms-Listbox
我在數據綁定方面有一個小問題(可能是愚蠢的問題)。 我嘗試綁定列表
List<double> _measuredValues = new List<double>();
到winforms ListBox。
在Form_Load中,我設置:
lstMeasuredValues.DataSource = _measuredValues;
更新值時,什么都沒有出現?
_measuredValues.Add(numBuffer);
我想到的一件事是數據類型問題。 但是,如何僅將類型更改為字符串呢?
lstMeasuredValues.DataSource = _measuredValues.ToString().ToList();
另一個原因可能是代碼的高行在另一個線程中。 但是我認為這不應該是問題。
如何綁定此列表?
更好的方法是清除項目並再次分配數據源:
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();
更新值時,什么都沒有出現?
_measuredValues.Add(numBuffer);
為了使UI能夠反映數據源的修改,數據源必須提供某種變更通知。 WinForms列表數據綁定基礎結構使用IBindingList接口的 ListChanged事件 。 提供了一個標准的BindingList <T>類 ,可以使用它代替List<T>
以獲得所需的行為。 您只需要更改此行
List<double> _measuredValues = new List<double>();
至
BindingList<double> _measuredValues = new BindingList<double>();
另一個原因可能是代碼的高行在另一個線程中。 但是我認為這不應該是問題。
這不好。 您必須確保不要這樣做,因為預期UI線程上會引發ListChanged
事件。
問題在於,通用List
不是數據綁定的正確選擇。 如果要保持更新ListBox,則應使用BindingList 。
嘗試以這種方式使用它:
BindingList<double> bindList = new BindingList<double>(_measuredValues);
lstMeasuredValues.DataSource = bindList;
請記住,當您在_measuredValues中添加新項目時,必須手動刷新綁定,直到現在為止,如下所示:
bindList.ResetBindings();
您可以將BindingList<double>
用作列表框的數據源
List<double> _measuredValues = new List<double>();
BindingList<double> bindList = new BindingList<double>(_measuredValues);
lstMeasuredValues.DataSource = bindList;
現在,每次您需要添加元素時,請使用bindList變量,列表框以及_measuredValues
列表將自動更新
最簡單的方法之一是:
lstMeasuredValues.DataSource = null; //the cheapest, trickiest, but the most important line
lstMeasuredValues.DataSource = _measuredValues;
每當您的_measuredValues
元素更新時
您需要執行的所有操作以在更新后刷新列表:
lstMeasuredValues.Refresh();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.