C# 用C语言中的对象填充列表
我试图用c语言编写一个简单的GUI程序,但不幸的是我遇到了一些困难。现在我将尝试解释我的程序的基本结构。我为三个不同的群体开设了三门课:大学教授、大学生和不工作也不学习的人。我有一些从文件中读取信息的方法,如教授的头衔、姓名、大学名称、学生的教员编号等。。我逐行读取文件,并将信息保存在3个类之一的对象中。在那之后,我把那个对象放在一个列表中。所以我的问题来了。我想读取列表中的每个对象,取其名称,并将其放入其他windows窗体上动态创建的标签中。这是我代码的一小部分:C# 用C语言中的对象填充列表,c#,user-interface,C#,User Interface,我试图用c语言编写一个简单的GUI程序,但不幸的是我遇到了一些困难。现在我将尝试解释我的程序的基本结构。我为三个不同的群体开设了三门课:大学教授、大学生和不工作也不学习的人。我有一些从文件中读取信息的方法,如教授的头衔、姓名、大学名称、学生的教员编号等。。我逐行读取文件,并将信息保存在3个类之一的对象中。在那之后,我把那个对象放在一个列表中。所以我的问题来了。我想读取列表中的每个对象,取其名称,并将其放入其他windows窗体上动态创建的标签中。这是我代码的一小部分: private void
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老实说,我不确定您的对象模型是否真的有意义。因为每个人都不同于其他人,而不是每个人的子集,所以让他们从一个点派生出来更合理。我倾向于定义一个单人类,然后从这个类派生出三个类中的每一个。您仍然可以看到每个对象处理的是哪个类,然后对其进行强制转换。然而,撇开这一点不谈,我认为您将其转换为所需对象的基本前提是可以的,您只需要进一步调试,并仔细检查是否将正确的数据放到了正确的位置。是的,我同意,该模型确实没有意义,但我仍在学习编程,并且不时会出错。在这种情况下,我给了学生一个学生的头衔,因为我认为在这种情况下,对我来说会更容易。最后我可以说,我发现了我的程序中的问题所在。我创建了一个对象,它是在使用它的方法之外定义的。所以它从未被破坏,整个列表都是同一个对象。谢谢你们的帮助,你们帮了我很大的忙找到了那个小故障。