2013-04-15 1 views
1

내 응용 프로그램을 탐색하려면로드시 Mainwindow가 표시됩니다. TeacherTools 창을 열 수있는 버튼이 있습니다. 여기에서 새 학생을 목록에 추가 할 수 있습니다. 이 창에는 MainWindow로 돌아갈 수있는 뒤로 버튼이 있으며 여기에서 정보를 사용할 수 있음을 확인할 수 있습니다. 나는 학생들이 나중에 질문을 받고 학생들의 점수가 현재로드 된 학생 비자의 이름에 추가되어야하는 시험 창인 제 3의 창을 엽니 다.C# Windows 간의 데이터 손실

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

답변

1

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

참고 내가하지 않은 이것을 테스트했지만, 이것이 당신이 찾고있는 접근법이라고 생각합니다. 또한 클래스를 사용하는 대신 서로 다른 윈도우를 전달하여 위험한 게임을 할 수 있다고 말합니다.

+0

당신이 한 일을 이해했다고 생각합니다. 고마워요. – Melky

+0

감사합니다. 내 대답이 도움이 되었기 때문에 기쁩니다. – dbooth

2

당신의 창에서 이름을 "테스트"당신은 객체 teachTools를 사용하지만 당신이 어디를 만들지 않았습니다.

MainWindow에 비슷한 이름의 객체가 있지만이 객체는 테스트 윈도우와 공유되지 않습니다. 또한 테스트 창에 새 인스턴스를 만들어야합니다.

+0

죄송합니다. 복사하는 동안 실수를 저 지르지 만, 어쨌든 위의 내용은 업데이트를 참조하십시오. – Melky

+0

TeacherTools-class를 보여줄 수 있습니까? 또한 어떤 개체가 실제로 NullReference를 던지고 있습니까? – Kenneth

+0

어떤 라인이 Exception을 던지고 있습니까 ??? –

1

studentList에 null 항목 (s.Name 부분을 던져 버릴 수 있음)이 있거나 studentName이 null 인 항목 (studentName.Text 부분 던지기).

+0

이것이 사실이 아니라는 것을 확인할 수 있습니다. MainWindow에서 학생 목록 내 개체를 변경할 수는 있지만 테스트 창에서는 변경할 수 없습니다. – Melky