DropDown事件中有一个函数可以自动更新serialPort,所以我们定期清除(),先清除{COM 1,COM 2,COM 3},断开连接后再清除{COM 1,COM 2},重新连接后可能会清除{COM 1,COM 2,COM 3}。
问题是每当事件发生时,先前选择的值消失。有人指出这是由于使用clear()
。但是,当DropDownStyle
为DropDown
时,不会出现此问题。
我编写了下面的代码来生成comboBox1
ReadOnly
。
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
我还有这样的代码:
private void comboBox1_DropDown(object sender, EventArgs e)
{
comboBox1.Items.Clear();
// Logic to automatically add items to comboBox1
.
.
.
}
我该怎么解决这个问题呢?关键是除了用户选择值之外,它不能在组合框中输入。
2条答案
按热度按时间hjqgdpho1#
我没有在同一个线程上发布多个答案的习惯,但根据您的帮助性评论,似乎您发布的"潜在"原因是希望保持
ComboBox
与当前连接的COM端口最新。对于你一开始尝试做的事情,可能有一个更好的解决方案(这被称为X-Y Problem)。在我以前的工作中,我经常做串行端口和USB枚举。我在这一过程中学到的一个技巧是,每当物理事件发生时,WinOS都会发布一条消息
WM_DEVICECHANGE
,比如插入或断开USB串行端口设备。在WinForms应用程序中,通过重写
WndProc
可以直接检测到它:我仍然主张将组合框的
DataSource
属性赋给BindingList<ComPort>
,其中ComPort
是我们设计用来表示连接信息的类:这种方法需要做一些额外的工作,但枚举会生成一个包含其他有用信息的描述符:
现在不再需要组合框的
DropDown
事件。问题解决了!vc9ivgsu2#
下面是使用
Clear
的替代方法。一个解决方案是有一个绑定列表,它是你的组合框的数据源。当你枚举可用的COM端口时(如下面的模拟所示),你将根据可用性从绑定源中添加或删除com端口。这应该会产生你想要的行为,因为如果com端口“仍然”可用,选择将不会改变。