【问题标题】:C# static winform controls not appearingC#静态winform控件没有出现
【发布时间】:2015-02-15 05:32:14
【问题描述】:

一开始我很困惑。我开始明白我的代码正在跳过第二个,因为我的 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。 equireq[rc].Visible 导致对象引用未设置为对象的实例。 两者都在索引 0。

从逻辑上讲,由于第二个 for 期间的错误,第三个 for 语句永远不会执行。我通过注释掉第二个来确认第三个很好。

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

【问题讨论】:

    标签: c# arrays winforms controls


    【解决方案1】:

    对于这样一个含糊不清、不是很有用的代码示例,我们无法确定哪里出了问题。

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

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

    我什至不愿将上述内容作为答案发布,但它似乎与代码示例所能提供的答案一样具体。如果这些信息不足以帮助您找到代码中的错误,请发布(很多)更好的代码示例。请参阅 How to create a Minimal, Complete, and Verifiable exampleHow do I ask a good question?,了解如何发布有用的好问题的好建议。

    【讨论】:

    • 我确实使用 MessageBox.Show() 在几个点上验证了该值是 59。我会阅读您提供的这两个链接。与此同时,我已经返回并更新了原始帖子。问题似乎源于equipCore是静态的,因为我一直试图将它写入项目中的单独文件中。
    • 我最终编写了一个接受 NUD[] 的静态 streamWriter 方法。我从其他所有东西中删除了静电。这似乎有效并且足够有效,同时允许正确显示控件。
    • @Branden:正如我所写,问题很可能是因为静态字段equipCoreskillTotal 变量之前初始化。因此,您分配了一个长度为零的数组(skillTotal 在初始化之前的默认值为0)。听起来在使所有内容都变为非静态的过程中,您将数组的初始化延迟了足够长的时间,以确保 skillTotal 在分配数组时具有正确的值。也就是说,问题和我上面猜的一样。
    • 其实你错了。问题出在声明中,但不在初始化中。我基于枚举初始化了变量。枚举是项目的一部分,并且在任何时候都没有更改后编译。变量数组初始化为适当的长度 (59),而不是 0 长度。问题是静态控件(无论出于何种原因)无法正确添加到控件中,并且不会引发异常或错误。我的问题是,当我应该使用一种方法将非静态值传递给静态方法时,我将(包含的)控件设为静态。
    • @Branden:如果数组的长度合适,您将不会得到IndexOutOfRangeException 尝试使用其他有效索引值索引数组。这只是一个事实。我了解您自己可能对究竟出了什么问题感到困惑,并通过重新排列代码意外地解决了问题。但是.NET 不会一时兴起就抛出IndexOutOfRangeException 进行数组访问。它总是,因为索引超出范围。
    猜你喜欢
    • 2014-03-15
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多