将列表<double>绑定到WinForms-Listbox

时间:2016-01-13 15:11:51

标签: c# .net winforms data-binding listbox

我有一个小的(可能是愚蠢的)数据绑定问题。我尝试绑定一个List

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

到winforms ListBox。

在Form_Load中,我设置了:

lstMeasuredValues.DataSource = _measuredValues;

当我更新值时,什么都没有出现?!

_measuredValues.Add(numBuffer);

我想到的一件事是数据类型问题。但是如何更改类型只是为了将其更改为字符串?

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

另一个原因可能是代码的上面一行是在另一个线程中。但我认为这应该不是问题。

如何绑定此列表?

6 个答案:

答案 0 :(得分:3)

更好的方法是清除项目并再次分配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 :(得分:3)

  

当我更新值时,什么都没有出现?!

     

_measuredValues.Add(numBuffer);

为了允许UI反映数据源修改,数据源必须提供某种更改通知。 WinForms列表数据绑定基础结构使用ListChanged eventIBindingList Interface。提供了一个标准BindingList<T> class,可以使用List<T>代替List<double> _measuredValues = new List<double>(); 来获得所需的行为。你所需要的就是改变这一行

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

ListChanged
  

另一个原因可能是代码的上面一行是在另一个线程中。但我认为这不应该是问题。

那不好。您必须确保不这样做,因为预计会在UI线程上引发byte事件。

答案 2 :(得分:2)

问题在于,通用List不是数据绑定的正确选择。如果要更新ListBox,则应使用BindingList

尝试以这种方式使用它:

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

请记住,当您在_measuredValues中添加新项目时,您必须手动刷新绑定,就像我现在一样,这样:

bindList.ResetBindings();

答案 3 :(得分:1)

您可以使用BindingList<double>作为列表框的数据源

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

现在,每当您需要添加元素时,请使用bindList变量,您的列表框将自动更新以及_measuredValues列表

答案 4 :(得分:1)

最简单的方法之一是:

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

每当您的_measuredValues元素更新时

答案 5 :(得分:0)

更新后,您只需刷新列表即可:

lstMeasuredValues.Refresh();