2015-01-26 2 views
0

Я продолжаю получать ObjectDisposedExpection, когда мне нужно получить форму для показа. Вы, может быть, знаете, как это сделать? В foreach by NotitiesForm.Show() Я получаю ошибку ObjectDisposedExpection. Я программирую в Visual Studio Ultimate 2012 C#.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' вызывает у вас проблемы. Как минимум, вам нужно подписаться на событие FormClosed, чтобы вернуть эту переменную в значение «null». С высокой степенью вероятности, что вся переменная просто не полезна, так как вы никогда не повторно используете объект формы. Просто удалите его. –

+0

Где вы 'новый'' NotitiesTB'? Вы когда-нибудь распоряжались им? – DrKoch

ответ

0

Код, который вы опубликовали, выглядит «достаточно хорошим». То есть вы устанавливаете переменную NotitiesForm, когда объект находится, и вы создаете новую, если она равна нулю. Пока весь этот код выполняется в основном потоке пользовательского интерфейса, эта часть в порядке.

Но обратите внимание, что все элементы управления в Form удаляются, когда находится Form. Таким образом, ваше управление NotitiesTB будет удалено с первого раза, когда ваш NotitiesForm будет закрыт. Затем вы добавляете этот элемент управления к следующему экземпляру Form, который вы создаете, и когда он показан, вы получаете исключение, потому что вы пытаетесь показать Form, содержащий элемент управления, который уже был удален.

Правильный способ сделать это было бы разработать реально Form подкласс , который уже содержит экземплярRichTextBoxвы хотите. Тогда вам не нужно добавлять новый экземпляр в каждый новый экземпляр создаваемого вами Form.

Запрет на то, что вам нужно создать новый экземпляр RichTextBox, чтобы перейти с каждым новым созданным вами экземпляром Form, например. в том же месте, где у вас есть заявление NotitiesForm = new Form();.

Смежные вопросы