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
}
}
在名为"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。