1

C#でGUIを使用して簡単なプログラムを作成しようとしていますが、残念ながらいくつかの問題があります。次に、プログラムの基本構造について説明します。私は3つの異なるグループの人々(大学教授、大学生、そして仕事も勉強もしていない人々)のために3つのクラスを持っています。ファイルから情報を読み取る方法がいくつかあります(教授の役職、名前、大学名、学生の学部番号など)。ファイルを1行ずつ読み取り、3つのクラスのいずれかのタイプのオブジェクトに情報を保存します。その後、そのオブジェクトをリストに入れました。だからここに私の問題が来る。リストからすべてのオブジェクトを読み取り、その名前を取得して、他のWindowsフォームで動的に作成されたラベルを付けたいと思います。これが私のコードの一部です。

private void button1_Click(object sender, EventArgs e)
{
        ForeignPeople fPeople = new ForeignPeople();
        UniversityProfessors uProf = new UniversityProfessors();
        UniversityStudents uStudents = new UniversityStudents();
        if (radioButton1.Checked == true)
        {
            objList1 = loadList();
            Form2 f2 = new Form2();
            for (int i = 0; i < objList1.Count; i++)
            {
                if (objList1[i] is UniversityStudents)
                {
                    uStudents = (UniversityStudents)objList1[i];
                    tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
                    Label et_tag = new Label();
                    et_tag.Name = "label" + i.ToString();
                    et_tag.Text = uStudents.getFirstName().ToString() + " " + uStudents.getLastName().ToString();
                    et_tag.AutoSize = true;
                    f2.tableLayoutPanel1.Controls.Add(et_tag, 0, i);
                    Label op = new Label();
                    op.AutoSize = true;
                    op.Text = "description";
                    f2.tableLayoutPanel1.Controls.Add(op, 1, i);
                }
                else if (objList1[i] is UniversityProfessors)
                {
                    uProf = (UniversityProfessors)objList1[i];
                    tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
                    Label et_tag = new Label();
                    Label label = new Label();
                    et_tag.Name = "label" + i.ToString();
                    et_tag.Text = uProf.getFirstName().ToString() + " " + uProf.getLastName().ToString();
                    et_tag.AutoSize = true;
                    f2.tableLayoutPanel1.Controls.Add(et_tag, 0, i);
                    Label op = new Label();
                    op.AutoSize = true;
                    op.Text = "description";
                    f2.tableLayoutPanel1.Controls.Add(op, 1, i);
                }
                else if (objList1[i] is ForeignPeople)
                {
                    fPeople = (ForeignPeople)objList1[i];
                    String name, Name;
                    tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
                    Label et_tag = new Label();
                    et_tag.Name = "label" + i.ToString();
                    et_tag.Text = fPeople.getFirstName().ToString() + " " + fPeople.getLastName().ToString();;
                    et_tag.AutoSize = true;
                    f2.tableLayoutPanel1.Controls.Add(et_tag, 0, i);
                    Label op = new Label();
                    op.AutoSize = true;
                    op.Text = "description";
                    f2.tableLayoutPanel1.Controls.Add(op, 1, i);
                }

            }
            f2.FormClosed += new FormClosedEventHandler(childFormClosed);
            f2.Show();
            this.Hide();
}

ただし、1つのオブジェクトに属する行が2つ以上ある場合(たとえば、ファイルに2人以上の学生、または2人以上の教授がいる場合)、すべてのラベルのテキストは最後に読み取られたオブジェクトの名前になります。問題がリストまたは私が作成したキャストにあることは知っていますが、私がやりたいことを行う別の方法を理解することはできません。誰かが助けてくれたらとてもありがたいです。

4

1 に答える 1

0

コメントでphoogが言及した変更に加えて、ループ内の各セクションに「人」オブジェクトのインスタンス化を移動します。そうすれば、古いものが適切に破壊されていることを確認できます。また、キャストが機能したことを確認するためのチェックを追加します。

private void button1_Click(object sender, EventArgs e)
{
    if (radioButton1.Checked == true)
    {
        objList1 = loadList();
        Form2 f2 = new Form2();

        for (int i = 0; i < objList1.Count; i++)
        {
            if (objList1[i] is UniversityStudents)
            {
                UniversityStudents uStudents = (UniversityStudents)objList1[i];

                if (uStudents != null)
                {
                    // do stuff
                }
                else
                {
                    // do something sensible with the error here
                }
            }
            // if clauses for the other "people" objects
            // ...
        }
        f2.FormClosed += new FormClosedEventHandler(childFormClosed);
        f2.Show();
        this.Hide();
    }
}
于 2012-11-28T16:16:49.603 に答える