2012-11-28 185 views
1

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

但是,如果我有两条或多条线属于一个对象(例如我有两个或更多的学生,或在文件中两个或两个以上的教授)的所有标签的文本都会变成最后一个读取对象的名称。我知道问题出现在列表或演员阵容中,但我无法找到另一种做我想做的方式。如果有人能提供帮助,我将非常感激。

+5

不是你的问题的答案,但你的三个类应该从一个通用的基类继承。公共逻辑(名字,姓氏,描述)应该在该基类中定义。那么你不需要类型测试,因为三个类型特定的代码块是相同的。 – phoog

+0

在我的计划中,大学教授继承了FreignPeople和UniversityStudents,继承了大学教授。 FreignPeople有字段的名字和姓氏,UniversityProfessors增加了这个大学的名字和一个标题(phd,assistent等),UniversityStudents增加了教师编号。所以我想知道上面的代码的问题在哪里,是演员不正确还是其他问题。 –

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

我也试过,但结果是一样的,所有的标签都会得到最后一个读取对象的名称。 –

+0

@ user1860311这很奇怪。你确定你正确地存储对象吗?也许你的代码中存在一个错误,它会从文件中提取数据并将其分配给对象。 –

+0

有可能没有正确存储代码。 objList1中的对象来自Object类型。那你怎么看我检查每一个对象,如果它是大学生,大学工作人员或外国人的实例,然后将它投到其中一个类中。我认为这是正确的,但如果不纠正我。 –