2015-01-26 5 views
0

Form을 표시해야 할 때 ObjectDisposedExpection이 계속 표시됩니다. 혹시이 작업을 수행하는 방법을 알고 계신가요? NotthingForm.Show() foreach에서 ObjectDisposedExpection 오류가 발생합니다. Visual Studio Ultimate 2012 C#에서 프로그래밍 중입니다.Form을 표시하는 동안 ObjectDisposedException이 발생했습니다.

RichTextBox NotitiesTB = new RichTextBox(); 
private Form NotitiesForm; 

/// <summary> 
/// 
/// </summary> 
/// <param name="label"></param> 
/// 
public void NotitiesLatenZien() 
{ 
    if (filename != null) 
    {     
     BRTSignal signal = new BRTSignal(filename); 
     BRTEventRepository Notities = new BRTEventRepository(signal); 

     List<IBRTNote> note = Notities.ReadNotes(); 

     BRTEventService TijdNotities = new BRTEventService(signal); 
     TijdNotities.MakeNoteTimesRelativeToTrack(note, 1); 

     //TextBox NotitiesTB = new TextBox(); 
     //NotitiesTB.Name = "Notities"; 

     if (NotitiesForm == null) 
     { 
      NotitiesForm = new Form(); 
     }    

     NotitiesForm.Height = 600; 
     NotitiesForm.Width = 1000; 
     NotitiesForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 
     NotitiesForm.MaximizeBox = false; 
     NotitiesForm.Disposed +=NotitiesForm_Disposed; 

     NotitiesForm.Text = "Notities"; 

     NotitiesTB.Multiline = true; 
     NotitiesTB.Height = 600; 
     NotitiesTB.Width = 980; 
     NotitiesTB.ReadOnly = true; 

     NotitiesTB.Clear(); 

     //NotitiesTB.Click += NotitiesTB_Click; 

     //NotitiesTB.SelectionStart = Convert.ToInt32(referenceLineSelectedPage); 

     NotitiesTB.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Both; 

     NotitiesTB.Name = "Notities"; 

     NotitiesForm.Controls.Add(NotitiesTB); 

     foreach (IBRTNote notes in Notities.ReadNotes()) 
     { 
      //string test = Convert.ToString((notes.Time)); 
      //textBox1.Text = String.Concat(textBox1.Text, string.Concat(Environment.NewLine, notes.Text)); 
      if (NotitiesTB.Text == "") 
      { 
       NotitiesTB.Text += new BRTToDotNET.RTDateTime((long)notes.Time).ToDotNet().ToString() + "  " + notes.Text; 
      } 
      else 
      { 
       NotitiesTB.Text += "\r\n" + new BRTToDotNET.RTDateTime((long)notes.Time).ToDotNet().ToString() + "  " + notes.Text; 
      } 
      //MessageBox.Show("\r\n" + notes.Text); 
      NotitiesForm.Show(); 
      NotitiesForm.BringToFront(); 
     } 
    } 
    else 
    { 
     MessageBox.Show("Er blijkt een .sig file te missen. Controleer of u een .sig file heeft ingeladen."); 
    } 
} 

private void NotitiesForm_Disposed(object sender, EventArgs e) 
{ 
    NotitiesForm = null; 
} 
+0

어떤 라인에서이 예외가 발생합니까? – Caramiriel

+1

Form 객체는 일회용 객체입니다. 닫힌 후에는 더 이상 사용할 수 없으며 새 것을 만들어야합니다. 'NotitiesForm' 변수가 문제를 일으키고 있습니다. 최소한 변수를 'null'로 설정할 수 있도록 FormClosed 이벤트를 구독해야합니다. 높은 확률로 전체 변수는 실제로 유용하지 않습니다. 왜냐하면 여러분이 실제로 form 객체를 결코 다시 사용하지 않기 때문입니다. 그냥 삭제하십시오. –

+0

'NotitiesTB'를 어디에서 새롭게합니까? 당신은 그것을 처분합니까? – DrKoch

답변

0

게시 한 코드가 "충분 함"입니다. 즉, 객체가 폐기 될 때 NotitiesForm 변수를 설정하고 null 인 경우 새 변수를 만듭니다. 모든이 코드가 메인 UI 스레드에서 실행되는 한, 그 부분은 괜찮습니다.

Form의 모든 컨트롤은 Form이 처리 될 때 처리됩니다. 따라서 귀하의 이 처음 폐쇄 될 때 귀하의 NotitiesTB 통제는 폐기 될 것입니다. 그런 다음 해당 컨트롤을 다음에 작성한 Form 인스턴스에 추가하면 이미 삭제 된 컨트롤이 포함 된 Form을 표시하려고하기 때문에 예외가 발생합니다.

이미을 원하는RichTextBox인스턴스를 포함하는 실제 Form 서브 클래스 를 설계하는 것이 작업을 수행하는 올바른 방법. 그런 다음 새로 작성한 Form의 새 인스턴스에 새 인스턴스를 계속 추가하지 않아도됩니다.

예외가 발생하면 새로 작성한 Form 인스턴스와 함께 사용할 RichTextBox 인스턴스를 새로 만들어야합니다 (예 : NotitiesForm = new Form(); 성명을 갖고있는 곳과 같은 곳입니다.