C#静态winform控件没有出现

时间:2015-02-15 05:32:15

标签: c# arrays winforms controls

最初我很困惑。我开始明白我的代码正在跳过第二个因为我的NUD数组是静态的。我的设置就是这个。

Controls.cs是AranockCompanion.cs的一个部分类,是我的主要winform。我有我的所有控件(标签,numiercUpDownS,按钮,文本框),这些控件不是在设计器中创建的(在程序上相反)在此文件中。然后我有一个用于Enums.cs的文件和一个用于GameData.cs的文件(基本上用信息初始化数组)和一个用于基本FileIO.cs的文件。

由于我的fileWriting方法将有关项目的信息转储到文件中,我不得不将其设置为静态。我认为这与StreamWriter IIRC有关。所以我不得不在Controls类中使我的数组静态/公共访问它。现在因为它是静态的..这种情况发生了。

我觉得静态/新/对象和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] .Visible导致IndexOutOfRangeException。 equipReq [rc] .Visible导致Object引用未设置为对象的实例。 两者都在索引0。

从逻辑上讲,第3个for语句永远不会执行,因为第2个for期间出错。我通过评论第二个来确认第三个没问题。

任何解释或帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用这样一个模糊的,不是非常有用的代码示例,不可能肯定地说出了什么问题。

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

NullReferenceException而言,如果您的代码在填充equipReq的任何成员之前抛出异常,则会出现这种情况。我认为如果你修复equipCore的初始化,两个例外都会消失。

我甚至不愿意将上述内容作为答案发布,除非它似乎是一个特定的答案,因为代码示例可以提供。如果这不足以帮助您在代码中找到错误,请发布(更多)更好的代码示例。请参阅How to create a Minimal, Complete, and Verifiable exampleHow do I ask a good question?,以获取有关如何发布好的有用问题的建议。