绑定列表<;加倍>;到WinForms列表框

本文关键字:列表 WinForms 加倍 lt 绑定 gt | 更新日期: 2023-09-27 18:30:04

我在数据绑定方面遇到了一个小问题(可能是愚蠢的)。我尝试绑定列表

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

到winforms ListBox。

在Form_Load中我设置:

lstMeasuredValues.DataSource = _measuredValues;

当我更新值时,什么都不显示?!

_measuredValues.Add(numBuffer);

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

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

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

如何绑定此列表?

绑定列表<;加倍>;到WinForms列表框

当我更新值时,什么都不显示?!

_measuredValues.Add(numBuffer);

为了允许UI反映数据源修改,数据源必须提供某种更改通知。WinForms列表数据绑定基础结构使用IBindingList接口的ListChanged事件。有一个标准提供的BindingList<T>类,该类可以代替CCD_ 1来获得期望的行为。你所需要的只是更改这条线路

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

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

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

这不好。您必须确保不要执行此操作,因为ListChanged事件预计会在UI线程上引发。

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

问题是常见的List不是数据绑定的正确选择。如果要保持ListBox的更新,则应使用BindingList。

试着这样使用:

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

请记住,当您在_measuredValues中添加新项时,您必须手动刷新绑定,就我目前而言,如下所示:

bindList.ResetBindings();

您可以使用BindingList<double>作为Listbox 的DataSource

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();