动态UI,循环无法正常工作

时间:2012-05-01 21:07:56

标签: c# loops dynamic user-interface

这是我正在使用的代码 它应该为用户输入的每个模块名称创建标签,并为其下的该模块创建所有评估名称。应该使用任何数量的模块和评估。问题是它只显示最后显示的模块的评估。

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个中的最后一个。对于最后一个模块“另一个模块”,它显示所有评估。

1 个答案:

答案 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>