2011-08-02 55 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