这是我正在使用的代码 它应该为用户输入的每个模块名称创建标签,并为其下的该模块创建所有评估名称。应该使用任何数量的模块和评估。问题是它只显示最后显示的模块的评估。
dat.Modules和dat.Assessments是arraylists,每个都包含4个元素,其中包含有关模块或评估的信息,这就是我将计数除以4的原因。
private void testingButton_Click(object sender,EventArgs e) {
int pos1 = 50;
int pos2 = 150;
int modLength = dat.Modules.Count;
modLength = modLength / 4;
int assessLength = 0;
int arrayData = 0;
int displayCount = 0;
for (int i = 0; i < modLength; i++)
{
this.moduleLabels.Add(new Label());
System.Drawing.Point pLabel1 = new System.Drawing.Point(50, pos1);
(moduleLabels[i] as Label).Location = pLabel1;
(moduleLabels[i] as Label).Size = new System.Drawing.Size(100, 13);
(moduleLabels[i] as Label).Text = dat.Modules[arrayData].ToString();
tabPage5.Controls.Add((moduleLabels[i] as Label));
String asd = dat.Modules[arrayData + 2].ToString();
Console.WriteLine(asd);
assessLength = int.Parse(asd);
pos2 = pos1 + 25;
for (int y = 0; y < assessLength; y++)
{
this.assessLabels.Add(new Label());
System.Drawing.Point pLabel2 = new System.Drawing.Point(70, pos2);
(assessLabels[y] as Label).Location = pLabel2;
(assessLabels[y] as Label).Size = new System.Drawing.Size(250, 13);
(assessLabels[y] as Label).Text = dat.Assessments[displayCount + 1].ToString() + " weights " + dat.Assessments[displayCount+2].ToString() +"%, Enter your mark:";
textboxComputer.Add(new TextBox());
System.Drawing.Point pText1 = new System.Drawing.Point(400, pos2);
(textboxComputer[y] as TextBox).Location = pText1;
(textboxComputer[y] as TextBox).Size = new System.Drawing.Size(20, 20);
tabPage5.Controls.Add(assessLabels[y] as Label);
tabPage5.Controls.Add(textboxComputer[y] as TextBox);
pos2 = pos2 + 25;
displayCount = displayCount + 4;
}
pos1 = pos2+25;
arrayData = arrayData + 4;
}
}
这是它显示的一个例子
http://dc540.4shared.com/download/YI8IENYI/tsid20120501-211723-cbc785f9/asd.jpg
前两个模块应列出其评估。第一个不显示任何。对于Java,它仅显示该模块的总共3个中的最后一个。对于最后一个模块“另一个模块”,它显示所有评估。
答案 0 :(得分:1)
对于i
的每个增量,y
从0开始。然后向assessLabels
添加新标签,但尝试使用assessLabels[y]
访问您添加的标签通常会产生为先前值i
创建的标签。这会导致为第一个模块创建的标签被下一个模块重用,等等。
快速解决方案不是使用assessLabels[y]
而是使用assessLabels[assessLabels.Count - 1]
。
更好的解决方案是为标签创建局部变量,设置其属性,然后然后将它们添加到列表中:
for (int y = 0; y < assessLength; y++)
{
Label assessLabel = new Label();
assessLabel.Location = ...;
// etc.
tabPage5.Controls.Add(assessLabel);
assessLabels.Add(assessLabel);
}
这也消除了连续转换ArrayList成员和不必要的访问列表的需要。
PS。如果assessLabels
仅包含Labels
类型的对象,请考虑改为使用List<Label>
。