现在感谢@ omaxel的
BindingList<string> UIDList = new BindingList<string>();
和
lbUID.Invoke((MethodInvoker)delegate
{
UIDList.Add(UID);
});
和@Ming Zhou的
//reset the DataSource
lbUID.DataSource = null;
lbUID.DataSource = UIDList;
从列表中添加项目后,表单中的列表框不会更新。它确实为列表添加了一个值,并且整数(beschikbarePlekken)按预期工作。你可以帮帮我吗?这是我的代码。
public partial class Form1 : Form
{
// Variabelen
SerialPort port;
int beschikbarePlekken = 255; // Beschikbare parkeerplekken
string UID = " ";
List<string> UIDList = new List<string>();
public Form1()
{
InitializeComponent();
port = new SerialPort("COM12", 9600);
port.DataReceived += incoming;
port.Open();
lbUID.DataSource = UIDList;
}
private void incoming(object sender, SerialDataReceivedEventArgs e)
{
UID = port.ReadLine().Trim();
if (UID.Length == 0)
{
return;
}
UpdateList(UID);
}
delegate void SetLabel();
public void UpdateList(string UID)
{
if (!UIDList.Contains(UID) && UIDList.Count < beschikbarePlekken)
{
UIDList.Add(UID);
Console.WriteLine(UID);
lblPlek.Invoke(new SetLabel(SetLabelMethod));
}
}
void SetLabelMethod()
{
lblPlek.Text = "Beschikbare plekken: " + (beschikbarePlekken - UIDList.Count);
}
}
答案 0 :(得分:1)
您应该使用BindingList<string>
代替List<string>
。因此,每当您向UIDList
添加项目时,列表框都会更新。
来自Microsoft Docs:
BindingList<string>
:提供支持数据绑定的通用集合。
将UIDList
变量声明/初始化更改为:
BindingList<string> UIDList = new BindingList<string>();
另外,请记住在主线程上调用ListBox控件的Add
方法。在UpdateList
方法中,您可以使用
if (!UIDList.Contains(UID) && UIDList.Count < beschikbarePlekken)
{
lbUID.Invoke((MethodInvoker)delegate
{
UIDList.Add(UID);
});
lblPlek.Invoke(new SetLabel(SetLabelMethod));
}