【问题标题】:c# - Why couldn't I access the comboBox in Winform?c# - 为什么我无法访问 Winform 中的组合框?
【发布时间】:2020-04-16 14:04:54
【问题描述】:

form1 有三个组合框。在表单中我尝试创建以下代码。

public partial class Form1 : Form
{
    private List<ComboBox> comboBoxes = new List<ComboBox>() 
    {
        combobox1,combobox2,combobox3
    };
}

我收到类似

的错误
A field initializer cannot reference the non-static field, method, or property 

但我可以在函数内部访问这些组合框。我想创建组合框列表。告诉我为什么我无法访问它,以及如何实现?

【问题讨论】:

  • 字段在类构造函数之前初始化。这些参考文献还不存在。你可以写List&lt;ComboBox&gt; comboBoxes = new List&lt;ComboBox&gt;() { new ComboBox(), new ComboBox() };。没那么有用,对吧?无论如何,您都应该重新设置这些引用。
  • 这是一个旨在让您远离麻烦的语言规则。真麻烦。 .NET 运行时实际上并不支持这种复杂的字段初始化,C# 编译器通过将代码移动到构造函数来解决它。在您在构造函数中编写的任何代码(如果有的话)之前运行的第一件事。问题是, combobox1 (etc) 变量尚未初始化并且仍然为空。 InitializeComponent() 方法稍后运行。解决方法很简单,只需在 InitializeComponent() 调用之后移动赋值即可。

标签: c# windows visual-studio winforms


【解决方案1】:

Compiler Error CS0236: 实例字段不能用于初始化方法外的其他实例字段。

初始化控件后可以在构造函数中初始化列表:

public partial class Form1 : Form
{
    public Form1()
    {
        //...
        comboBoxes = new List<ComboBox>() { combobox1,combobox2,combobox3 };
    }
}

【讨论】:

  • 我在问为什么我可以在函数中访问它时无法访问它。
  • @prabhakaran 因为编译器限制:Instance fields cannot be used to initialize other instance fields outside a method
  • 无法保证combobox1, combobox2, combobox3初始化(因为comboBoxescombobox 将同时初始化)。这就是为什么编译器不会像这样编译代码的原因
【解决方案2】:

你需要在方法中添加控件

        public List<ComboBox> comboBoxes = new List<ComboBox>()

        public Form1()
        {
            InitializeComponent();

            comboBoxes.AddRange(new ComboBox[] {comboBox1, comboBox2, comboBox3});
        }

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多