c#如何引用动态创建的组合框?

c#如何引用动态创建的组合框?,c#,eventhandler,C#,Eventhandler,我有一些代码,可以在单击按钮时创建几个组合框。像这样的 for (int i =0; i< noCol;i++){ tableLayoutPanel2.RowCount = tableLayoutPanel2.RowCount + 1; tableLayoutPanel2.Controls.Add(new Label() { Text = "العمود " + (i+1) }, 0, (i)); var com = new ComboBox(); com.Name = "reportCo

我有一些代码,可以在单击按钮时创建几个组合框。像这样的

for (int i =0; i< noCol;i++){
tableLayoutPanel2.RowCount = tableLayoutPanel2.RowCount + 1;
tableLayoutPanel2.Controls.Add(new Label() { Text = "العمود " + (i+1) }, 0, (i));
var com = new ComboBox();
com.Name = "reportColumn" + (i + 1).ToString();
g = tableLayoutPanel2.Controls[com.Name] as ComboBox;
c.Add(g);
g.SelectedIndexChanged += new EventHandler(ReportWizardStep1ComboboxSelectedIndexchanged);
tableLayoutPanel2.Controls.Add(com,1,i);}

private void ReportWizardStep1ComboboxSelectedIndexchanged(object sender, EventArgs e){ComboBox combo = sender as ComboBox;
MainForm.exportReport.getDataGridView1().ColumnCount++;
MainForm.exportReport.getDataGridView1().Columns
            [MainForm.exportReport.getDataGridView1().ColumnCount - 1].HeaderText = g.Text;
comboValues.Add(g.Text);}
例外情况是:

发生“System.NullReferenceException”类型的异常。我怎样才能解决这个问题


您正在创建一个新的组合框,设置一个名称并在tableLayoutPanel2中搜索这个新创建的控件。控件…它将返回null。。。您应该先添加它,然后再查找它。

我正在尝试遵循您的逻辑。您可以创建一个组合框“com”。然后将同名的组合框引用到“g”。然后将“g”移动到“c”控制集合。然后将“com”添加到TableLayoutPanel。那么,您是否正在尝试用组合框替换组合框?你想做什么让你跳过这些障碍?这是什么:
c.Add(g)?为什么要尝试将
g
设置为
tableLayoutPanel2
的现有子控件?你不是刚刚创建了这个新的组合框吗?通气处理程序应该由
com
订阅,而不是这个
g
(顺便说一句,这可能是
null
,整个事情都没有意义)。动态创建组合框后,我正试图通过使用其引用名称为每个人处理“selectedIndexChanged”。我使用这个“g=tableLayoutPanel2.Controls[com.Name]作为组合框;”来获取引用名称您的代码示例不容易阅读:引用名称(对新创建控件的引用)是
com
。将处理程序附加到此实例并将实例添加到集合中<代码>c.添加(g)仍然是一个神秘的银行。它现在运行良好。但是dataGridView1仍然没有显示添加的任何新列标题文本。我怎样才能解决这个问题?我尝试了“MainForm.exportReport.getDataGridView1().Refresh();”,但仍然无法使用应用程序。DoEventsApplication.DoEvents也无法工作,因为您正在使用g.text。您应该使用g.name。我不需要组合框引用名称作为datagridview的标题文本。我需要用户从其项目中选择的内容,这些项目是字符串
g.SelectedIndexChanged += new EventHandler(ReportWizardStep1ComboboxSelectedIndexchanged);
tableLayoutPanel2.Controls.Add(com,1,i);
...
var com = new ComboBox();
com.Name = "reportColumn" + (i + 1).ToString();
g = tableLayoutPanel2.Controls[com.Name] as ComboBox;
c.Add(g);
g.SelectedIndexChanged += new EventHandler(ReportWizardStep1ComboboxSelectedIndexchanged);
tableLayoutPanel2.Controls.Add(com,1,i);}