【问题标题】:Displaying List Collection to the textbox在文本框中显示列表集合
【发布时间】:2015-05-07 21:44:54
【问题描述】:

我有这门课给学生

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

【问题讨论】:

    标签: c# wpf visual-studio textbox


    【解决方案1】:

    在选择学生之前你需要预览他们,为此你需要使用 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());
        }
    

    【讨论】:

      【解决方案2】:

      如果您想将名称保留在文本框中,您应该从 _Click 处理程序中删除这些行:

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

      至于显示学生列表,如果您为此使用单独的控件,您的问题并不清楚。我不确定您是否要显示一个用户列表,每个名称部分只有一个文本框控件。请澄清。

      如果您只想在已经检索到单个学生(在“其他处理程序”中)后在文本框中显示名字和姓氏,那么您只需要:

      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);
      }
      

      现在,在您的处理程序(或者在我的情况下,我的小测试控制台应用程序的 Main)中,您可以这样调用它们:

      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);
      

      【讨论】:

      • 我正在使用不同的按钮来显示列表。
      • 请更新我的回答。我希望这可以帮助您找到可行的解决方案。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多