【问题标题】:Dynamic UI, Loop not working correctly动态 UI,循环无法正常工作
【发布时间】:2012-05-01 21:07:56
【问题描述】:

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

dat.Modules 和 dat.Assessments 是数组列表,它们每个都包含 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 个模块。对于最后一个模块“另一个模块”,它会显示所有评估。

【问题讨论】:

    标签: c# loops dynamic user-interface


    【解决方案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&lt;Label&gt;

    【讨论】:

    • 希望我可以再给一个 +1 以表示考虑使用List&lt;Label&gt;。除非没有其他选项,否则不应使用 ArrayList。在这种情况下,Label[] 将同样有效。
    猜你喜欢
    • 2019-01-01
    • 2022-11-04
    • 2014-12-02
    • 2013-08-09
    • 2013-10-30
    • 2013-10-19
    相关资源
    最近更新 更多