1

我正在尝试在 c# 中使用 GUI 制作一个简单的程序,但不幸的是我遇到了一些困难。现在我将尝试解释我的程序的基本结构。我为三种不同的人群(大学教授、大学生和既不工作也不学习的人)开设了 3 节课。我有一些从文件中读取信息的方法(教授的职称、姓名、大学名称、学生的教职编号等)。我逐行读取文件并将信息保存在 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();
}

但是,如果我有两行或多行属于一个对象(例如,我有两个或多个学生,或者文件中有两个或多个教授),则所有标签的文本都将使用最后读取的对象的名称。我知道问题出在列表或我制作的演员表中,但我想不出另一种方法来做我想做的事。如果有人可以提供帮助,我将不胜感激。

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