2016-01-13 75 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();