ListBox仅在第一次调用时更新? C#

时间:2017-06-08 12:00:28

标签: c# winforms listbox

我在ListBox studentListBox中有一个Form1,它显示studentList的成员Form2。有一个班级Student,其中包含有关每个学生的一些不同属性。

我在BindData()中也有一个功能Form1,它将studentListBox数据源设置为studentList。它还会将studentListBox显示成员设置为Name,这是类Student中的属性。

Form1

public void BindData()
        {
            if (studentListHome != null)
            {
                studentListBox.DataSource = studentListHome;
                foreach(Student s in studentListHome)
                {
                    studentListBox.DisplayMember = "Name";
                }

            }
        }

Form1_Load上调用BindData,也可以通过单击刷新按钮调用它。

Form2创建每个学生并将其添加到studentList Form1内部。点击提交按钮后执行此操作

Form2

private void submitButton_Click(object sender, EventArgs e)
        {
            if (comparator(nameInput) &
               comparator(idInput) &
               comparator(bdayInput)){
                variable_assignment();
                var tempStudent = StudentCreation();
                if(tempStudent != null)
                {
                    studentListForm2.Add(tempStudent);
                }
                testList.Add(tim);
                testList.Add(john);
                testList.Add(tempStudent);

                foreach(Student s in testList)
                {
                    homeForm.StudentListHome.Add(s);
                }
                homeForm.BindData();
            }
        }

comparator()是一个确保用户输入字段不为空的函数。 variable_assignment()将用户输入分配给相关变量。 StudentCreation()是一个实现Student

的函数

就像我在标题中提到的那样,ListBox仅在第一次调用时更新,之后,它保持完全相同。我知道Students已添加到List<Student> ListBox绑定的Console.WriteLine,因为我Student他们正在studentList我可以看到新auto baseVector = std::make_unique<std::vector<Base*>>(); auto baseVector = std::make_unique<std::vector<std::unique_ptr<Base>>>(); 正在每次单击提交按钮时都会添加到baseVector.push_back(std::make_unique<SubClass>());

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

一些小事

if (studentListHome != null)
        {
            studentListBox.DataSource = studentListHome;
            foreach(Student s in studentListHome)
            {
                studentListBox.DisplayMember = "Name";
            }

        }

foreach是多余的,因为你只需要为列表框设置一次而不是列表框中的每个项目。

    if (studentListHome != null)
    {
        studentListBox.DataSource = studentListHome;
        studentListBox.DisplayMember = "Name";
    }

接下来回答你的问题,你必须使用BindingList而不是任何其他类型的集合,然后进行比较和排序,你可以在Student类本身上实现IComparable和INotifiyPropertyChanged。

然后你不再重新绑定,只需修改BindingList实例来操作列表,列表框就会与列表同步。