【发布时间】: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