2011-08-02 52 views
2

我想在C#中填充组合框,但出于某种原因,项目不会出现。C#Combobox不显示项目

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。

+0

调用代码是什么? –

+0

什么线程正在设置属性?它是一个计时器线程还是主要的“Windows消息循环”? –

+0

我认为你将需要提供更多信息才能得到一个很好的答案。 – hspain

回答

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

这里我们直接将列表直接传递给comboBox上的items.AddRange()方法。

我怀疑这不适用于你 - 其他事情正在进行,但我已经从背景工作者(其中InvokeRequired为true)和主UI线程尝试了它。

+0

我同意,我不认为Add是问题。我在这个问题中提供了一些额外的信息,希望能够帮助指出问题所在。 – Daniel

+0

@Daniel - 你在哪里调用代码来设置你的列表?这听起来像是你在表单窗口(因此句柄)已经被设置之前做的。也许尝试将代码放入表单加载事件中,或者如果您正在尝试某种ModelViewPresenter模式,其中演示者正在设置该数据,请非常小心表单已初始化 - 可能是通过将回调从主持人传递给视图。 –

0

这是一个错误,你指的是combobox和combobox1?也许这是你的错误。

+0

是的,这是一个错字。谢谢。 – Daniel

0

你的意思是“没有出现”,因为你可以看到他们,当列表显示,或者你甚至不能滚动到他们?

Combobox有很多属性可以影响你所看到的。为combobox.MaxDropDownItems尝试一个更大的值。

+0

我看不到它们,滚动到它们,任何东西。 MaxDropDownItems不可能是问题,因为我甚至看不到1个项目。 – Daniel

+0

'Combobox.Items.Count'等于1,'MaxDropDownItems'等于8.下拉菜单是空的。 – Daniel

0

我在这个线程中的其他答案是真的只是展示如何做到这一点,如果你可以得到提供你列表的代码。既然听起来你不能,我正在提供这个答案。

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

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

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

看看Jon Skeet here这篇文章,他讨论了如何正确地等待一个变量被另一个线程设置。在做这件事时你会小心 - 线程问题可能是令人讨厌的。

+0

我现在的时间有点短暂,否则我也会提供一些代码 - 如果你想要一些例子的话,请留下评论,我会看到回到它。 –

+0

非常感谢您的支持。其实我找出了问题所在。我的项目涉及与外部设备的通信,并且我有一个处理通信的单例类。其中一种方法是委托给我的一种方法,当我摧毁表格时,我忘了 - =代表。我很困惑,为什么它第一次运作,但不是第二次! – Daniel