c#窗口之间的数据丢失

本文关键字:数据 窗口 之间 | 更新日期: 2023-09-27 18:09:25

为了浏览我的应用程序,您将在加载时呈现主窗口。有一个按钮,你可以点击它打开教师工具窗口。从这里,您可以向列表中添加新的学生。在这个窗口上,我有一个返回按钮,将返回到主窗口,我可以确认这里的信息仍然可用。我遇到了一个问题,即我打开第三个窗口,这是一个考试窗口,学生在此窗口中提出问题,他们的分数应该添加到当前加载的学生签证他的名字。

private List<Student> studentList = new List<Student>();
public partial class MainWindow : Window
{
    TeacherTools teachTools = new TeacherTools();
    Learning myLearning = new Learning();
    private void teachAdmin_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        teachTools.ShowDialog();
        this.Show();
    }
    private void Selection_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        myTest.studentName.Text = studentsList.SelectedValue.ToString();
        myTest.ShowDialog();
        this.Show();
    }
}
//Exam Window
public partial class Test : Window
{
    //I'm sure its not this
    Student loadedStudent = new Student();
    TeacherTools teachTools = new TeacherTools();
    public void(private void finishTest()
    {
        loadedStudent = teachTools.Kids.Find(delegate(Student s) { return s.Name == studentName.Text; }); //This line 
        loadedStudent.Attempted = true;
        loadedStudent.Score = score;
    }
}

因此,我得到一个"对象引用不设置为对象的实例"。——得到NullReferenceException。"我不确定为什么会发生这种情况,因为我可以从主窗口修改学生对象。

编辑:TeacherTools Class

public partial class TeacherTools : Window
{
    private List<Student> studentList = new List<Student>();
    public TeacherTools()
    {
        InitializeComponent();
    }
    public List<Student> Kids
    {
       get { return studentList; }
       //set { studentList = value; }
    }
    private void newStudentClick(object sender, RoutedEventArgs e)
    {
        Student student = new Student();
        student.Name = nameBox.Text;
        studentList.Add(student);
        studentData.ItemsSource = studentList;
        studentData.Items.Refresh();
        //nameBox
    }
}

c#窗口之间的数据丢失

在名为"Test"的窗口中,您正在使用对象teachTools,但您还没有在任何地方创建它。

在主窗口中确实有一个类似的命名对象,但它不与测试窗口共享。您还应该在test窗口

中创建一个新实例

看起来,当您打开Test窗口时,您正在创建TeacherTools窗口的新实例,这意味着Kids列表中没有元素。如果这是您想要实现的方式,您可以将Test窗口中的TeacherTools实例设置为公共属性,并从主窗口传递该对象,如下所示:

//Test Window
public partial class Test : Window
{
    Student loadedStudent = new Student();
    public TeacherTools teachTools { get; set; }
    ...
}
//Main Window
public partial class MainWindow : Window
{
    ...
    private void Selection_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        myTest.teachTools = this.teachTools;
        myTest.ShowDialog();
        this.Show();
    }
}

请注意,我还没有测试过这个,但我认为这是你正在寻找的方法。我还想说的是,你可能在玩一个危险的游戏,在彼此之间传递不同的窗口,而不是使用一个类来处理这个。

要么是studentList包含一个空项(这将导致s.Name部分抛出),要么是studentName为空项(这将导致studentName。