C# 静态 winform 控件没有出现

C# static winform controls not appearing

起初我很困惑。我开始明白我的代码跳过了第二个,因为我的 NUD 数组是静态的。我的设置是这样的。

Controls.cs 是 AranockCompanion.cs 我主要 winform 的部分 class。我的所有控件(标签、numiercUpDownS、按钮、文本框)都不是在设计器中创建的(而是以编程方式)在此文件中。然后我有 1 个 Enums.cs 文件和一个 GameData.cs 文件(基本上用信息初始化数组)和一个基本 FileIO.cs.

文件

由于我的 fileWriting 方法会将有关项目的信息转储到文件中,因此我必须将其设为静态。我认为它与 StreamWriter IIRC 有关。所以我不得不在控件 class 中创建我的数组 static/public 来访问它。现在因为它是静态的.. 会发生这种情况。

我觉得 static / new / objects 和 OOP 的基础以及我如何设置项目的一般设计存在一些相当基本的潜在问题,但我无法在我.

为什么代码会过早地跳过执行循环而没有任何类型的错误并成功启动程序???

    //Equipment Tab Page
    Label[] equipLabels = new Label[skillTotal];
    public static NumericUpDown[] equipCore = new NumericUpDown[skillTotal];
    NumericUpDown[] equipReq = new NumericUpDown[skillTotal];


                #region Equipment
        MessageBox.Show("0_" + skillTotal);
        x = labelEquipSkill.Location.X - panelEquip.Location.X;
        for (int skillCount = 0; skillCount < skillTotal; skillCount++)
        {
            equipLabels[skillCount] = new Label();
            panelEquip.Controls.Add(equipLabels[skillCount]);
            equipLabels[skillCount].Text = GameData.skillsAll[skillCount];
            equipLabels[skillCount].Location = new System.Drawing.Point(x, skillCount * spacer);
            equipLabels[skillCount].Size = new System.Drawing.Size(50, 15);
        }
        MessageBox.Show("1_" + skillTotal);
        x = labelEquipBase.Location.X - panelEquip.Location.X ;
        for (int skillCount = 0; skillCount < skillTotal; skillCount++)
        {
            equipCore[skillCount] = new NumericUpDown();
            panelEquip.Controls.Add(equipCore[skillCount]);
            equipCore[skillCount].Minimum = 0;
            equipCore[skillCount].Maximum = 255;
            equipCore[skillCount].Value = 0;
            //equipCore[skillCount].Text = GameData.skillsAll[skillCount]; 
            equipCore[skillCount].Location = new System.Drawing.Point(x, skillCount * spacer);
            equipCore[skillCount].Size = new System.Drawing.Size(50, 15);
        }

        MessageBox.Show("2_" + skillTotal);
        x = labelEquipReq.Location.X - panelEquip.Location.X;
        for (int skillCount = 0; skillCount < skillTotal; skillCount++)
        {
            equipReq[skillCount] = new NumericUpDown();
            panelEquip.Controls.Add(equipReq[skillCount]);
            equipReq[skillCount].Minimum = 0;
            equipReq[skillCount].Maximum = 255;
            equipReq[skillCount].Value = 0;
            //equipReq[skillCount].Text = GameData.skillsAll[skillCount];
            equipReq[skillCount].Location = new System.Drawing.Point(x, skillCount * spacer);
            equipReq[skillCount].Size = new System.Drawing.Size(50, 15);
        }
        #endregion


    private void buttonVisible_Click(object sender, EventArgs e)
    {
        for (int rc = 0; 0 < skillTotal; rc++)
        {
            MessageBox.Show("" + rc);
            //equipCore[rc].Visible = true;
            equipReq[rc].Visible = true;
        }
    }

equipCore[rc]。可见导致 IndexOutOfRangeException。 equipReq[rc].Visible 导致对象引用未设置为对象的实例。 都在索引 0.

从逻辑上讲,由于在第二个 for 期间发生错误,第三个 for 语句永远不会执行。我通过注释掉第二个来确认第三个没问题。

如有任何解释或帮助,我们将不胜感激。

对于这样一个模糊的、不是很有用的代码示例,不可能确定哪里出了问题。

就是说,IndexOutOfRangeException,显然您正在使用字段初始值设定项初始化一次 equipCore 数组,这表明在初始化时,skillTotal 变量仍设置为其默认值 0,而不是您预期的 59

NullReferenceException 而言,如果您的代码在填充 equipReq 的任何成员之前抛出异常,这是可以预料的。我假设如果您修复 equipCore 的初始化,两个异常都会消失。

我什至对 post 上面的答案犹豫不决,除了它似乎与代码示例提供的答案一样具体。如果这些信息不足以帮助您找到代码中的错误,请 post 一个(好得多)更好的代码示例。有关如何 post 一个好的、有用的问题的好建议,请参阅 How to create a Minimal, Complete, and Verifiable example and How do I ask a good question?