使用C#中的对象填充列表

时间:2012-11-28 16:00:36

标签: c# user-interface

我正在尝试使用c#中的GUI创建一个简单的程序,但不幸的是我遇到了一些困难。现在我将尝试解释我的程序的基本结构。我为三个不同的人群(大学教授,大学生和不工作或学习的人)分为3个班级。我有一些从文件中读取信息的方法(教授的头衔,姓名,大学名称,学生的教师编号等)。我逐行读取文件,并将信息保存在3个类之一的对象中。之后我将该对象放入List中。所以这就是我的问题。我想从列表中读取每个对象并获取其名称并在其他窗体上添加动态创建的标签。这是我的代码的一小部分:

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();
}

但是,如果我有两条或更多条属于一个对象的行(例如我有两个或更多学生,或者文件中有两个或更多教授),则所有标签的文本都将带有最后一个读取对象的名称。我知道这个问题出现在List或者我所做的演员阵容中,但是我无法想出另一种做我想做的事情。如果有人可以提供帮助,我将非常感激。

1 个答案:

答案 0 :(得分:0)

除了phoog在评论中提到的更改之外,我还会将“people”对象的实例化移动到循环内的每个部分中。这样你就可以确定旧版本被正确销毁了。我还会添加一个检查以确保演员工作。

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();
    }
}