C#窗口之间的数据丢失

时间:2013-04-15 01:33:46

标签: c# wpf listbox nullreferenceexception

为了浏览我的应用程序,您将在加载时看到Mainwindow。您可以单击一个按钮打开TeacherTools窗口。从这里,您可以将新学生添加到列表中。在这个窗口,我有一个返回按钮,将返回MainWindow,我可以确认信息仍然可以在这里使用。我遇到了一个问题,即我打开第3个窗口,这是一个考试窗口,学生之后会向他们提问,他们的分数应该加到当前加载的学生签证上。

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”。我不确定为什么会发生这种情况,因为我可以从MainWindow修改Student对象。

编辑:TeacherTools类

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

3 个答案:

答案 0 :(得分:2)

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

您的MainWindow中确实有一个类似命名的对象,但这不会与Test-window共享。您还应该在测试窗口中创建一个新实例

答案 1 :(得分:1)

studentList包含一个null项(会导致s.Name部分抛出),或者studentName为null(这会导致studentName.Text部分抛出)。

答案 2 :(得分:1)

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

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

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