0

これは私が使用しているコードです。ユーザーが入力した各モジュール名と、その下にあるそのモジュールのすべての評価名のラベルを作成することになっています。任意の数のモジュールと評価で動作する必要があります。問題は、最後に表示されたモジュールの評価しか表示されないことです。

dat.Modules と dat.Assessments は配列リストであり、それぞれがモジュールまたは評価に関する情報を含む 4 つの要素を保持しているため、カウントを 4 で割ります。

private void testingButton_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

最初の 2 つのモジュールには、評価がリストされている必要があります。最初のものは何も表示されません。Java の場合、そのモジュールの合計 3 つのうち、最後の 1 つだけが表示されます。最後のモジュール「別のモジュール」では、すべての評価が表示されます。

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タイプ のオブジェクトのみを含む場合は、代わりにLabelsa を使用することを検討してください。List<Label>

于 2012-05-01T22:10:30.807 に答える