C# 组合框不显示项目

问题描述 投票:0回答:5

我正在尝试在 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。

c# combobox setter
5个回答
1
投票

不确定为什么你的代码不起作用 - 我尝试过,它工作得很好。

但是,下面是一些更简单的代码,它们也可以工作 - 您可能会发现这样做反而会让您的问题消失。这确实假设您没有其他原因需要遍历该属性 - 这是一种非常不寻常的做事方式。

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 线程尝试过它。


0
投票

您同时提到了组合框和组合框1,这是一个拼写错误吗?也许那是你的错误。


0
投票

您的意思是“不出现”,因为您可以在列表显示时看到它们,或者您甚至无法滚动到它们?

Combobox 有很多属性可以影响您所看到的内容。尝试为组合框设置更大的值。MaxDropDownItems。


0
投票

我在这个线程中的其他答案实际上只是展示了执行此操作的方法(如果您可以获取为您提供列表的代码)。既然听起来你不能,我就提供这个答案。

听起来关键问题是当调用属性时组合框尚未初始化。最好的答案是确保调用代码中不会发生这种情况。

如果您不能这样做,那么您应该等待属性设置后再使用它来填充组合框。

我会通过在属性设置器中设置一个私人列表来做到这一点。在表单加载事件中,我将放置一些代码(可能在后台工作人员中),这些代码将等待私有列表不为空,然后将其分配给组合框。

看看 Jon Skeet 的这篇文章,他讨论了如何正确等待另一个线程设置变量。执行此操作时您需要小心 - 线程问题可能会很严重。


0
投票

enter image description here

我想我发现了问题。我照常选择了绘图模式。

© www.soinside.com 2019 - 2024. All rights reserved.