System.ObjectDisposedException от простого отображения формы - PullRequest
0 голосов
/ 16 сентября 2009

Я пытаюсь выяснить, как при простом отображении диалогового окна WinForms (код ниже) я получаю следующее исключение и стек вызовов. Это не происходит постоянно, но я вижу это в журналах моих исключений. Есть идеи? Я не могу понять, что будет ссылаться на удаленный объект?

Я проверил (через оставшуюся часть стека вызовов), что приложение не закрывается, оно работает нормально.

System.ObjectDisposedException: Cannot access a disposed object.    
Object name: 'MainForm'.    
   at System.Windows.Forms.Control.CreateHandle()    
   at System.Windows.Forms.Form.CreateHandle()    
   at System.Windows.Forms.Control.get_Handle()    
   at System.Windows.Forms.Control.GetSafeHandle(IWin32Window window)    
   at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)    
   at MyApp.MainForm.PromptForProfile()    
   at MyApp.MainForm.LoadProfile()    
   at MyApp.MainForm.barButtonItem1_ItemClick(Object sender, ItemClickEventArgs e)

Это код для отображаемого диалога. Единственный "тупой" код - это, вероятно, обработчик textPassword_KeyDown. Я должен, вероятно, вытащить код, который я хочу, и не вызывать btnOK_Click таким образом.

public partial class ProfileForm : DevExpress.XtraEditors.XtraForm
   {
      public string _username;
      public string _password;

      public ProfileForm()
      {
         InitializeComponent();
      }

      private void btnOK_Click( object sender, EventArgs e )
      {
         _username = textUsername.Text;
         _password = textPassword.Text;
      }

      private void textPassword_KeyDown( object sender, KeyEventArgs e )
      {
         if ( e.KeyCode == Keys.Enter )
         {
            btnOK_Click( sender, null );
            this.DialogResult = DialogResult.OK;
            e.Handled = true;
         }
      }

      private void hyperLinkEdit1_Click( object sender, EventArgs e )
      {
         // show the proxy settings dialog
         ProxyForm pform = new ProxyForm();         
         pform.ShowDialog();         
      }
   }

Ответы [ 2 ]

0 голосов
/ 04 декабря 2009

Ваша трассировка стека говорит мне, что вы не попали в код ProfileForm. Он не работает на CreateHandle какого-то элемента управления. Без дополнительной информации я могу только догадываться:

  1. Убедитесь, что вы выполняете все манипуляции с пользовательским интерфейсом в потоке GUI. Даже если вы думаете, что это так, проверьте дважды. (Иногда резьба может быть тонкой.)

  2. Убедитесь, что вы не пытаетесь отобразить один и тот же экземпляр формы дважды, во второй раз после его удаления. Я вижу, что у вас ShowDialog() происходит, но если вы пытаетесь ShowDialog() в форме, которая уже была удалена, я бы ожидал, что она взорвется вот так.

  3. Убедитесь, что все пользовательские элементы управления в форме ведут себя правильно.

  4. Попробуйте использовать безопасную строку для поля пароля.

0 голосов
/ 16 сентября 2009

Хорошо, возможно, вы устанавливаете DialogResult в Ok, что закроет форму, но затем вы обращаетесь к событию, вызванному нажатием Enter. Я не слишком уверен в роли гиперссылки edit1 bit, хотя. Это в той же форме или в форме вызова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...