2017-10-14 24 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); } 
} 

感谢您的帮助一次。我希望这可以对其他人有用。