我正在尝试在 C# 中填充组合框,但由于某种原因,这些项目没有出现。
public List<string> items
{
set
{
combobox.Items.Clear();
foreach(string s in value)
{
combobox.Items.Add(s);
}
combobox.Update();
}
}
这看起来是非常简单的代码。 我根本看不出哪里出了问题。 它的称呼是这样的:
private void StoreNames(List<string> names)
{
if (selectionForm.InvokeRequired)
selectionForm.Invoke((MethodInvoker)delegate { selectionForm.items = names; });
else
selectionForm.items = names;
}
有趣的是,当
InvokeRequired
返回 true 时它似乎可以工作,但当它返回 false 时则不起作用。
编辑: 我发现
selectionForm.IsHandleCreated
现在是false
。 这导致 InvokeRequired
返回 false,但这也是定期调用 setter 不起作用的原因。 我不知道为什么 IsHandleCreated
设置为 false。 表格已显示()n。
不确定为什么你的代码不起作用 - 我尝试过,它工作得很好。
但是,下面是一些更简单的代码,它们也可以工作 - 您可能会发现这样做反而会让您的问题消失。这确实假设您没有其他原因需要遍历该属性 - 这是一种非常不寻常的做事方式。
public void StoreNames(List<string> input)
{
if (comboBox1.InvokeRequired)
comboBox1.Invoke((MethodInvoker)delegate {
StoreNames(input);
});
else
{
comboBox1.Items.Clear();
comboBox1.Items.AddRange(input.ToArray());
}
}
这里我们直接将列表传递给组合框上的 items.AddRange() 方法。
我怀疑这对你不起作用 - 发生了其他事情,但我已经从后台工作人员(其中 InvokeRequired 为 true)和主 UI 线程尝试过它。
您同时提到了组合框和组合框1,这是一个拼写错误吗?也许那是你的错误。
您的意思是“不出现”,因为您可以在列表显示时看到它们,或者您甚至无法滚动到它们?
Combobox 有很多属性可以影响您所看到的内容。尝试为组合框设置更大的值。MaxDropDownItems。
我在这个线程中的其他答案实际上只是展示了执行此操作的方法(如果您可以获取为您提供列表的代码)。既然听起来你不能,我就提供这个答案。
听起来关键问题是当调用属性时组合框尚未初始化。最好的答案是确保调用代码中不会发生这种情况。
如果您不能这样做,那么您应该等待属性设置后再使用它来填充组合框。
我会通过在属性设置器中设置一个私人列表来做到这一点。在表单加载事件中,我将放置一些代码(可能在后台工作人员中),这些代码将等待私有列表不为空,然后将其分配给组合框。
看看 Jon Skeet 的这篇文章,他讨论了如何正确等待另一个线程设置变量。执行此操作时您需要小心 - 线程问题可能会很严重。