2015-05-06 2 views
0

У меня есть этот класс для студентовОтображение списка коллекции в текстовое поле

#region Person 

    public class Person 
    { 
     public string firstName { get; set; } 
     public string lastName { get; set; } 
     public string Address { get; set; } 
     public virtual void GetInfo() 
     { 
      Console.WriteLine("First Name: {0}", firstName); 
      Console.WriteLine("First Name: {0}", lastName); 
      Console.WriteLine("Address: {0}", Address); 
     } 
    } 
    #endregion 
    class 

    #region Student 
    public class Student : Person 
    { 

     public override void GetInfo() 
     { 
      // Calling the base class GetInfo method: 
      base.GetInfo(); 
     } 
     public void TakeTest() 
     { 
      throw new NotImplementedException(); 
     } 



     private List<Student> AllStudents = new List<Student>(); 
     public Student() 
     { 
      AllStudents.Add(this); 

     } 
     public List<Student> AllStudentsList 
     { 
      get 
      { 
       return AllStudents; 
      } 
      set 
      { 
       AllStudents = value; 
      } 
     } 


    } 
    #endregion 

Использование WPF, я собираюсь начать несколько студентов, которые будут введены в текстовом поле, первое имя имеет свое текстовое поле и фамилия имеет свое текстовое поле также и создать коллекцию списков для хранения этих объектов-учеников. Я создал обработчик событий, чтобы добавить учащихся в список коллекции newStudent.

public List<Student> newStudent = new List<Student>(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void btnCreateStudent_Click(object sender, RoutedEventArgs e) 
     { 
      Student student = new Student(); 
      student.firstName = txtFirstName.Text; 
      student.lastName = txtLastName.Text; 
      newStudent.Add(student); 

      txtFirstName.Text = ""; 
      txtLastName.Text = ""; 

     } 

Моя проблема в том, когда я пытаюсь отобразить его обратно в текстовое поле (другой обработчик события), что хранится в списке, то результат не то, что я ожидаю, как фамилия, имя и фамилию. Как мне его реализовать, чтобы дать мне имя и фамилию начатого ученика.

В качестве фона, поскольку моя репутация не прошла квоту для публикации изображения, каждый раз, когда я вводил текстовое поле, я нажимаю кнопку «Создать ученик», которая добавляет имя ученика в коллекцию списков. После того, как несколько учеников были созданы, я хотел бы, чтобы они отображали последний элемент в списке в текстовое поле, когда я нажимаю другую кнопку (скажем, мы называем это btnPrevious. Я надеюсь, что кто-то может мне помочь в этом.

Это мой другой обработчик события, который будет отображать все студенты в списке

private void btnNext_Click(object sender, RoutedEventArgs e) 
     { 

      //Student student = new Student(); 
      //foreach (Student i in student.AllStudentsList) 
      //{ 
      // MessageBox.Show(i.Name); 
      //} 
      //MessageBox.Show(student.AllStudentsList[0].ToString()); 
     } 

ответ

0

Если вы хотите сохранить имена текстовых полей, вы должны удалить эти строки из обработчика _Click:.

txtFirstName.Text = ""; 
txtLastName.Text = ""; 

Как для отображения список студентов, это не было clea r из вашего вопроса, если вы используете для этого отдельный элемент управления. Я не уверен, что вы хотите отобразить список пользователей с одним элементом управления текстовыми полями для каждой части имени. Просьба уточнить.

Если все, что вы желая, чтобы отобразить имя и фамилию в текстовые поля после того, как вы уже получен один студент (в вашей «другой обработчик»), вы просто хотите:

txtFirstName.Text = student.firstName; 
txtLastName.Text = student.lastName; 

[Обновить] Вот несколько вспомогательных функций для отображения ученика и всех учеников. Вы можете изменить их для работы с любыми элементами управления, которые вы хотите использовать для отображения информации пользователя. Поместите их в свой класс учеников.

public void PrintStudent() 
{ 
    int i = AllStudents.Count - 1; //last student 
    Student thisStudent = this.AllStudents[i]; 
    string fName = thisStudent.firstName; 
    string lName = thisStudent.lastName; 
    Console.WriteLine(string.Format("{0}. {1} {2}", i+1, fName, lName)); 
} 

public void DisplayAll(List<Student> someStudents) 
{ 
    StringBuilder formattedStudents = new StringBuilder(); 
    int lastIndex = someStudents.Count - 1; 
    for (int i = 0; i < someStudents.Count; i++) 
    {     
     if (i == 0) 
     { 
      formattedStudents.AppendLine("Complete List of Students:");      
     } 
     string fName = someStudents[i].firstName; 
     string lName = someStudents[i].lastName; 
     formattedStudents.AppendLine(string.Format("{0}. {1} {2}", i + 1, fName, lName)); 

     if (i == lastIndex) 
     { 
      formattedStudents.AppendLine(); 
      formattedStudents.AppendLine("Have a nice day."); 
     } 

    } 
    Console.Write(formattedStudents); 
} 

Теперь в обработчике (или в моем случае, главный мой маленький тест консольного приложения), вы можете называть их так:

List<Student> listStudents = new List<Student>(); 

Student first = new Student(); 
first.firstName = "Mike"; 
first.lastName = "Smith"; 

Student second = new Student(); 
second.firstName = "Joe"; 
second.lastName = "Murphy"; 

Student last = new Student(); 
last.firstName = "Matthew"; 
last.lastName = "Mahern"; 

listStudents.Add(first); 
listStudents.Add(second); 
listStudents.Add(last); 

Student lastStudent = listStudents[listStudents.Count - 1]; //return the LAST Student in the list of All Students 
lastStudent.PrintStudent(); 

//now, display all students in the list 
lastStudent.DisplayAll(listStudents); 
+0

Я использую другую кнопку для отображения списка. – jbat21

+0

Обновите свой ответ. Надеюсь, это поможет вам достичь рабочего решения. Удачи! – mjw

0

Прежде чем выбрать студентов вам нужно просмотреть их , для этого вам нужно использовать ListBox или ListView.

// Use ObservableCollection for store and preview data in view controls (see more MVVM) 
    public ObservableCollection<Student> newStudents = new ObservableCollection<Student>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     MyListBox.ItemsSource = newStudents; // MyListBox you may create in code or using XAML 
    } 

Используйте событие SelectionChanged, чтобы выбрать выбранных студентов из списка.

private void SelectionChangedHandler(object sender, SelectionChangedEventArgs e){ 
     Student st = MyListBox.SelectedItem as Student; 

     if (st == null) return; 

     txtFirstName.Text = st.firstName; 
     txtLastName.Text = st.lastName; 
} 

UPD # 1

Ваша главная проблема заключается в плохой код логики в студенческой модели класса.

1) Ваш код ниже демонстрирует логику статического класса, но это не статический класс.

private List<Student> AllStudents = new List<Student>(); 
    public Student() 
    { 
     AllStudents.Add(this); 

    } 
    public List<Student> AllStudentsList 
    { 
     get 
     { 
      return AllStudents; 
     } 
     set 
     { 
      AllStudents = value; 
     } 
    } 

2) В коде MainWindow вы используете внешний список newStudent, но относятся к переменной AllStudentsList внутреннего класса.

private void btnNext_Click(object sender, RoutedEventArgs e) 
    { 

     //Student student = new Student(); 
     //foreach (Student i in student.AllStudentsList) 
     //{ 
     // MessageBox.Show(i.Name); 
     //} 
     //MessageBox.Show(student.AllStudentsList[0].ToString()); 
    } 

Collection student.AllStudentsList пуст, так как никогда не использовался. Попробуйте использовать этот код.

private void btnNext_Click(object sender, RoutedEventArgs e) 
    { 
     if(newStudent == null) MessageBox.Show("Students collection is null."); 
     foreach (Student i in newStudent) 
     { 
      MessageBox.Show(string.Format("First name: {0} Last name: {1}", i.firstName, i.lastName)); 
     } 
     //MessageBox.Show(student.AllStudentsList[0].ToString()); 
    } 
Смежные вопросы