[英]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.