【问题标题】:Displaying items in a list or array in C#在 C# 中显示列表或数组中的项目
【发布时间】:2014-08-21 17:17:54
【问题描述】:

我在尝试显示数组中的项目/对象列表时遇到了麻烦。

我正在做的是将学生的姓名、姓氏、年龄和科目(属性)标记添加到数组中。如果我以这种方式将 4 个学生添加到列表中,我想在单击“显示”按钮时再次在 RichTextBox 中显示所有学生及其属性。

如何在“displayAll_Click”功能中进行?我必须使用某种for循环吗?任何帮助将不胜感激。

我有以下代码:

在这个函数中,我将学生添加到数组中:

private void btnAdd_Click(object sender, EventArgs e)
    {
        // Create new student and assign name etc provided by user
        Student _Student = new Student();
        _Student.Name = txtName.Text;
        _Student.Surname = txtSurname.Text;
        _Student.Age = Convert.ToInt32(txtAge.Text);
        _Student.ITMark = Convert.ToInt32(txtIT.Text);
        _Student.MathMark = Convert.ToInt32(txtMath.Text);
        _Student.EngMark = Convert.ToInt32(txtEng.Text);

        MessageBox.Show("Student added.");

        // Increase counter and display how many students added so far
        CountStudents++;

        Average = Convert.ToInt32(txtIT.Text) + Convert.ToInt32(txtMath.Text) + Convert.ToInt32(txtEng.Text);
        _Student.AverageMark = Average / 3;

        //Display Student's properties in the richBox
        richTextBox1.Text = ("Student: " + Convert.ToString(CountStudents) +
                             "\nName: " + _Student.Name +
                            "\nSurname: " + _Student.Surname +
                             "\nAge: " + _Student.Age +
                             "\nStudent Average: " + Convert.ToString(_Student.AverageMark));

        //Add the newly added student to the ClassList array
        ClassList[CountStudents - 1] = _Student;

        //Clear the list after student is added
        txtAge.Clear();
        txtName.Clear();
        txtSurname.Clear();
        txtIT.Value = 0;
        txtMath.Value = 0;
        txtEng.Value = 0;
        txtName.Focus();
    }

在这个函数中,我想显示所有添加的学生,但是如何添加?

private void displayAll_Click(object sender, EventArgs e)
    {
        List<Student> _StudentList = new List<Student>();

        Student _Student = new Student();
        _Student.Name = txtName.Text;
        _Student.Surname = txtSurname.Text;
        _Student1.Age = Convert.ToInt32(txtAge.Text);
        _Student.ITMark = Convert.ToInt32(txtIT.Text);
        _Student.MathMark = Convert.ToInt32(txtMath.Text);
        _Student.EngMark = Convert.ToInt32(txtEng.Text);

        for (int i = 0; i < _StudentList; i++)
        {
            richTextBox1.Text = ("Student: " + Convert.ToString(CountStudents) +
                             "\nName: " + _Student.Name +
                            "\nSurname: " + _Student.Surname +
                             "\nAge: " + _Student.Age +
                             "\nStudent Average: " + Convert.ToString(_Student.AverageMark));
            i++;
        }
        //Displaying all the students
        MessageBox.Show("Display all students.");
    }

【问题讨论】:

    标签: c# arrays list for-loop


    【解决方案1】:

    您每次都在为 Richtextbox 分配新文本:

    使用

    richTextBox1.Text +=
    

    而不仅仅是

    richTextBox1.Text =
    

    完整代码:

    for (int i = 0; i < _StudentList; i++)
    {
        Student currentStudent = ClassList[i];    //get student from array
        richTextBox1.Text += ("Student: " + Convert.ToString(CountStudents) +
                             "\nName: " + currentStudent .Name +
                             "\nSurname: " + currentStudent .Surname +
                             "\nAge: " + currentStudent .Age +
                             "\nStudent Average: " + Convert.ToString(currentStudent .AverageMark));
                i++;    //you don't need to do it, let the loop handle it
    }
    

    它会将新字符串附加到其中而不删除之前的字符串。

    【讨论】:

    • 嗯,它的工作方式,但它只显示数组中的最后一项而不是全部??
    • 你的代码有很多问题。实际上,您并没有在任何地方添加 srudents。你只是给他们看。您需要创建一个全局List,您必须在方法btnAdd_Click 中添加学生,然后在方法displayAll_Click 中遍历该列表。
    • 我将它添加到数组中了吗?我不能通过数组循环以某种方式通过数组访问它吗?
    • 是的,您也可以从数组中访问它。
    【解决方案2】:

    尝试类似:

    foreach(var student in _StudentList)
    {
       richTextBox1.Text += ...
    }
    

    【讨论】:

      【解决方案3】:

      您的第二个函数看起来像一个大的复制和粘贴错误。 您正在创建一个空的 _StudentList,然后您继续迭代(尽管您将 int 与您的 for 中的 List 进行比较)。那么您将显示您刚刚从表单数据创建的一个学生。

      试试这个:

      private void displayAll_Click(object sender, EventArgs e)
      {
          richTextBox1.Clear();
          for (int i = 0; i < ClassList.Count; i++)
          {
              richTextBox1.Text += ("Student: " + Convert.ToString(i) +
                               "\nName: " + ClassList[i].Name +
                              "\nSurname: " + ClassList[i].Surname +
                               "\nAge: " + ClassList[i].Age +
                               "\nStudent Average: " + Convert.ToString(ClassList[i].AverageMark));
          }
          //Displaying all the students
          MessageBox.Show("Display all students.");
      }
      

      【讨论】:

      • 我不知道如何解释它,但它在 Visual Studio 2008 中给出了一个奇怪的错误,然后用黄色突出显示了整个 RichTextBox 的函数,比如对象引用未设置为对象?
      • 而 ClassList.Count 将不起作用。显然 '
      • 好吧,我不知道你的类列表的数据类型。不幸的是,不同的集合具有非常不一致的计数/长度方法或属性。在这种情况下,请尝试Count()。另一个错误取决于完整的源代码,我不知道 ypur 类列表在何时何地被初始化。
      【解决方案4】:

      您每次运行都会覆盖您的文本框,以及其他几个错误。我会使用 StringBuilder 和 foreach 循环

       StringBuilder sb = new StringBuilder();
       foreach (var student in _StudentList)
       {
            sb.Append(Environment.NewLine + "Name: " + student.Name);
            sb.Append(Environment.NewLine + "Surname: " + student.Surname);
            sb.Append(Environment.NewLine + "Age: " + student.Age);
            sb.Append(Environment.NewLine + "Student Average: " + student.AverageMark);
            sb.Append(Environment.NewLine);
       }
      
       richTextBox1.Text = sb.ToString();
      

      另外,您的第一行 "Student: " + Convert.ToString(CountStudents) 没有多大意义,CountStudents 是学生人数,而不是该特定学生的唯一标识符。

      【讨论】:

        猜你喜欢
        • 2019-02-25
        • 2017-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多