我想在c#中用GUI做一个简单的程序,但不幸的是我有一些困难。现在我将尝试解释我的程序的基本结构。我为三个不同的人群(大学教授,大学生以及不工作或学习的人)设有三门课程。我有一些从文件中读取信息的方法(教授的头衔,姓名,大学名称,学生的教师编号等)。我一行一行地读取文件并将信息保存在三个类中的一个类中的一个对象中。之后,我把这个对象放在一个List中。所以我的问题出现了。我想读取列表中的每个对象,并取其名称并放入其他窗口窗体上的动态创建的标签上。这是我的代码一小部分:用C中的对象填充列表#
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
在我的计划中,大学教授继承了FreignPeople和UniversityStudents,继承了大学教授。 FreignPeople有字段的名字和姓氏,UniversityProfessors增加了这个大学的名字和一个标题(phd,assistent等),UniversityStudents增加了教师编号。所以我想知道上面的代码的问题在哪里,是演员不正确还是其他问题。 –
是的,这是一种家庭作业,但我不明白是什么问题......我希望代码不是那么糟糕(哈哈)。所以你可以帮忙,我会很开心。 –