C# 用C语言中的对象填充列表

C# 用C语言中的对象填充列表,c#,user-interface,C#,User Interface,我试图用c语言编写一个简单的GUI程序,但不幸的是我遇到了一些困难。现在我将尝试解释我的程序的基本结构。我为三个不同的群体开设了三门课:大学教授、大学生和不工作也不学习的人。我有一些从文件中读取信息的方法,如教授的头衔、姓名、大学名称、学生的教员编号等。。我逐行读取文件,并将信息保存在3个类之一的对象中。在那之后,我把那个对象放在一个列表中。所以我的问题来了。我想读取列表中的每个对象,取其名称,并将其放入其他windows窗体上动态创建的标签中。这是我代码的一小部分: private void

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

但是,如果我有两行或多行属于一个对象,例如,我有两个或多个学生,或两个或多个教授在文件中,所有标签的文本都与上次读取的对象的名称一起变为文本。我知道问题出在我制作的列表或演员阵容中,但我想不出另一种方法来做我想做的事。如果有人能帮忙,我将不胜感激

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

这不是对您的问题的回答,但是您的三个类应该继承自一个公共基类。公共逻辑的名字、姓氏和描述应该在该基类中定义。那么您就不需要进行类型测试了,因为三个特定于类型的代码块是相同的。在我的程序中,UniversityProfessors继承FreigenPeople,UniversityStudents继承UniversityProfessors。FreigenPeople有名字和姓氏字段,university Professors添加到此university name和TitleHD、Assistant等,university Students添加教员编号。所以我想知道上面的代码哪里有问题,是演员阵容不正确还是其他原因。是的,这是一种家庭作业,但我不知道问题出在哪里。。。我希望代码不是那么糟糕。所以你能帮忙,我会很高兴的。问题是:你违反了原则。考虑:如果x是Student Console.WriteLineStudentx.getFirstName,则集合中的foreach变量x;否则,如果x是Prof Console.writelineprof x.getFirstName;若Student继承自Prof,那个么您只需在collection Console.WriteLinex.getFirstName中编写:foreach Prof x;各方面都比较简单。最后,继承被认为是一种关系的模型。学生不是教授,所以一个普通的抽象人基类会更好。我假设学生继承了教授,因为他们有一些与大学相关的共同属性,比如UniversityID。但教授可以拥有学生不会拥有的头衔。为了处理与大学相关的属性,我会这样做:抽象类Person{}类ForeignPerson:Person{}抽象类UniversityPerson:Person{}类学生:UniversityPerson{}类教授:UniversityPerson{}我也尝试过,但结果是一样的,所有标签都得到上次读取对象的名称。@user1860311这很奇怪。您确定首先正确存储了对象吗?也许你的代码中有一个bug,它从文件中提取数据并将其分配给对象。有可能代码没有正确存储。objList1中的对象来自类型对象。然后你可以看到我检查每个对象,如果它是大学学生、大学教授或外国人的实例,然后将其转换为一个类。我认为这是正确的,但如果不是正确的话。@user1860311老实说,我不确定您的对象模型是否真的有意义。因为每个人都不同于其他人,而不是每个人的子集,所以让他们从一个点派生出来更合理。我倾向于定义一个单人类,然后从这个类派生出三个类中的每一个。您仍然可以看到每个对象处理的是哪个类,然后对其进行强制转换。然而,撇开这一点不谈,我认为您将其转换为所需对象的基本前提是可以的,您只需要进一步调试,并仔细检查是否将正确的数据放到了正确的位置。是的,我同意,该模型确实没有意义,但我仍在学习编程,并且不时会出错。在这种情况下,我给了学生一个学生的头衔,因为我认为在这种情况下,对我来说会更容易。最后我可以说,我发现了我的程序中的问题所在。我创建了一个对象,它是在使用它的方法之外定义的。所以它从未被破坏,整个列表都是同一个对象。谢谢你们的帮助,你们帮了我很大的忙找到了那个小故障。