0

这是我正在使用的代码它应该为用户输入的每个模块名称以及该模块下的所有评估名称创建标签。应该与任意数量的模块和评估一起工作。问题是它只显示最后一个模块的评估。

dat.Modules 和 dat.Assessments 是数组列表,它们每个都包含 4 个元素,其中包含有关模块或评估的信息,这就是我将计数除以 4 的原因。

私人无效测试Button_Click(对象发送者,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 个模块。对于最后一个模块“另一个模块”,它会显示所有评估。

4

1 回答 1

1

对于 的每个增量iy从 0 开始。然后您将新标签添加到assessLabels,但尝试访问您添加assessLabels[y]的标签,这通常会产生为 的前一个值创建的标签i。这会导致为第一个模块创建的标签被下一个模块重用,依此类推。

一个快速的解决方案是不使用assessLabels[y]but 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只包含 type 的对象Labels,请考虑使用 aList<Label>代替。

于 2012-05-01T22:10:30.807 回答