【问题标题】:c# How to reference a dynamically created Combo box? [duplicate]c#如何引用动态创建的组合框? [复制]
【发布时间】:2019-02-22 22:02:35
【问题描述】:

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

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

但是,当我运行代码时,该行会抛出异常:

g.SelectedIndexChanged += new EventHandler(ReportWizardStep1ComboboxSelectedIndexchanged);
tableLayoutPanel2.Controls.Add(com,1,i);

例外是:

发生了“System.NullReferenceException”类型的异常。我该如何解决这个问题

【问题讨论】:

  • 我正在尝试遵循您的逻辑。您创建一个组合框“com”。然后将同名的 ComboBox 引用到“g”。然后将“g”移动到“c's”控件集合中。然后将“com”添加到 TableLayoutPanel。那么,您是否尝试用 ComboBox 替换 ComboBox?你想做什么让你越过这些障碍?
  • 这是什么:c.Add(g);?为什么要尝试将g 设置为tableLayoutPanel2 的现有子控件?您不只是创建这个新的 ComboBox 吗?通风处理程序应该由com 订阅,而不是这个g(顺便说一句,可能是null,整个事情没有意义)。
  • 动态创建组合框后,我尝试使用其参考名称为每个人处理“selectedIndexChanged”。我用这个“g = tableLayoutPanel2.Controls[com.Name] as ComboBox;”获取参考名称
  • 引用名称(对新创建控件的引用)是com。将处理程序附加到此实例并将实例添加到集合中。 c.Add(g); 还是个谜

标签: c# eventhandler


【解决方案1】:
...
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);}

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

【讨论】:

  • 谢谢。现在效果很好。但 dataGridView1 仍然没有显示添加的任何新列标题文本。我该如何解决这个问题?我试过“MainForm.exportReport.getDataGridView1().Refresh();”但仍然无法正常工作
  • 使用 Application.DoEvents
  • Application.DoEvents 也不起作用
  • 您正在使用 g.text。你应该使用 g.name。
  • 我不需要组合框引用名称作为 datagridview 的标题文本。我需要用户从其项目中选择的内容,即字符串
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多