2017-10-14 25 views
0

我正在一個簡單的C#表單中工作。我共有20個組合框。 10個組合框將包含類似的數據類型,並且將具有非常相似的名稱(CB1,CB2,CB3,... CB10)。每個ComboBox加載了5個元素A,B,C,D,E的列表(我的意思是我將這些值添加到10個「CB」ComboBoxes中的每一個)。我的目的是用戶可以從1個組合框或2個組合框中選擇項目(A,B,C,D,E中的一個)。 。 。或全部(10個組合框)。如何使用C#中的循環遍歷選定的ComboBoxes控件?

我希望從列表或數組中選擇項目的組合框中存儲數據。爲此,我想遍歷10個組合框(名稱爲CB1,CB2,CB3,...,CB10的組合框),檢查組合框中是否選擇了某個項目,並將組合框中選定的值存儲到組合框中一個列表(在列表下面的代碼中稱爲符號)。最後,我的符號列表長度(項目數量)將取決於用戶從中選擇多少個ComboBox。這裏是我使用的代碼:

List<string> symbols = new List<string>(); 

for (int i = 1; i <= 10; i++) 
{ 
var my_comboBox = this.Controls["CB" + i.ToString()]; 
if (null != my_comboBox.SelectedItem) 
{ symbols.add(my_comboBox.Text); } 
} 

當我運行代碼時出現以下錯誤。

未將對象引用設置爲對象的實例。

任何人都可以請解釋我做錯了什麼?我從另一個已發佈和回答的問題中獲得了代碼,下面是該問題的鏈接。提前致謝。

How can I iterate all ComboBoxes controls with a loop in C#?

我也嘗試提出在回答中引用的問題的其他選擇。 但它沒有奏效。它不通過foreach循環(雖然沒有顯示錯誤)。下面是選項2

List<string> symbols = new List<string>(); 

var comboBoxes = this.Controls.OfType<ComboBox>().Where(x => x.Name.StartsWith("CB")); 

foreach (var cmbBox in comboBoxes) 
{ 
if (null != my_comboBox.SelectedItem) 
{ symbols.add(my_comboBox.Text); } 
} 

再次,如果任何人都可以請提供給我的想法是什麼,我做錯了,這將是非常不錯的代碼。再次感謝提前。

ComboBoxes屬於如下圖所示的窗體。在那裏ComboBoxes被稱爲component_CB1,component_CB2,component_CB3,...,component_CB10(我將問題中的ComboBoxes的名稱更改爲CB,以便更容易理解)。

screenshot of my solution explorer

+0

組合框直接添加到窗體中,或者它們位於某些其他容器(如組框或面板)內部?只有將代碼直接添加到表單中,您的代碼才能正常工作。 –

+0

親愛的@ChetanRanpariya感謝您的幫助。我不確定是否將組合框直接添加到我的表單「Form1」中。我上傳瞭解決方案資源管理器的圖片,組合框在那裏。我相信他們是直接添加的,但你能糾正。 –

+1

從解決方案資源管理器我找不出如果組合框直接添加到窗體或添加到某個容器。但我認爲你正在嘗試使用無效的id從控件數組中獲取組合框。組合框名稱以'component'開始,但您嘗試使用「CB」進行搜索。你應該做'this.Controls [「component_CB」+ i.ToString();''。你的循環也應該以'i = 1'開頭,因爲沒有名爲'component_CB0'的組合框。 –

回答

2

謝謝大家誰促成找到答案這個問題。請閱讀評論以確定貢獻者。

答案是你可以遍歷C#中選定的組合框。但是,要使其工作您需要確保知道您的ComboBoxes添加到哪個容器控件。

要知道容器控件是你的組合框添加到的,轉到查看→其他窗口→文檔大綱。您可以查看這些控件是否是表單的直接子對象,或者是否是另一個容器控件的子對象。

如果組合框添加到您的形式直接,那麼這裏有兩個備選方案通過組合框迭代:

1備選方案:(組合框直接加入表格)

List<string> symbols = new List<string>(); 
for (int i = 1; i <= 10; i++) 
{ //CB is the begining of the name of the comboboxes CB1, CB2, ... CB10 
var my_comboBox = this.Controls["CB" + i.ToString()]; 
if (null != my_comboBox.SelectedItem) 
{ symbols.add(my_comboBox.Text); } 
} 

方案2 :(組合框添加到形式直接地)

List<string> symbols = new List<string>(); 
//CB is the begining of the name of the comboboxes CB1, CB2, ... CB10 
var comboBoxes = this.Controls.OfType<ComboBox>().Where(x=>x.Name.StartsWith("CB")); 

foreach (var cmbBox in comboBoxes) 
{ 
if (null != my_comboBox.SelectedItem) 
{ symbols.add(my_comboBox.Text); } 
} 

如果組合框被加入到不同的控制容器(例如,在一個TabControl一個選項卡,在我itial case),您必須指定控制容器名稱而不是「this」。以下是兩個替代方案,例如添加到名爲tab1的選項卡的組合框Cb1,CB2,CB3,...,CB10。

ALTERNATIVE 1:(組合框加到一個TabControl的選項卡)

List<string> symbols = new List<string>(); 
for (int i = 1; i <= 10; i++) 
{//CB is the begining of the name of the comboboxes CB1, CB2, ... CB10 
var my_comboBox = tab1.Controls["CB" + i.ToString()]; 
if (null != my_comboBox.SelectedItem) 
{ symbols.add(my_comboBox.Text); } 
} 

ALTERNATIVE 2:(組合框加到一個TabControl的選項卡)

List<string> symbols = new List<string>(); 
//CB is the begining of the name of the comboboxes CB1, CB2, ... CB10 
var comboBoxes = tab1.Controls.OfType<ComboBox>().Where(x 
=>x.Name.StartsWith("CB")); 

foreach (var cmbBox in comboBoxes) 
{ 
if (null != my_comboBox.SelectedItem) 
{ symbols.add(my_comboBox.Text); } 
} 

感謝您的幫助一次。我希望這可以對其他人有用。