Проблема с MessageBox.Show в улове - PullRequest
1 голос
/ 20 марта 2009

Когда я пытаюсь запустить следующий код, это вызывает необработанное исключение. После долгих изменений кода, который я нашел, если закомментировал строку MessageBox.Show, проблема исчезла! Необычно я использовал сообщения MessageBox.Show в других сегментах catch {} в других частях кода без проблем. Мой вопрос: кто-нибудь знает, почему это вызывает исключение?

(P.s Reports_Group_Chooser - ComboBox)

Код:

string GroupName= (string)Reports_Group_Chooser.SelectedItem;
byte[] ConfigBytes= new byte[]{};
try{
    ConfigBytes= File.ReadAllBytes("Reports/"+ GroupName.ToLower() +".grp");
}catch{
    MessageBox.Show("The file for this group is missing. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    Reports_Group_Chooser.Items.RemoveAt(NewGroup);
    Reports_Group_Chooser.SelectedIndex= 0;
}

Ошибка (ну, большая ее часть):

Необработанное исключение: System.NullReferenceException: объект ссылка не установлена ​​на экземпляр объект в System.Windows.Forms.ComboBox.DropDownListBoxFinished () [0x00000] at (обертка Remoting-Invoke-с проверкой) System.Windows.Forms.ComboBox: DropDownListBoxFinished () в System.Windows.Forms.ComboBox + ComboListBox.HideWindow () [0x00000] в System.Windows.Forms.ComboBox + ComboListBox.OnMouseUp (System.Windows.Forms.MouseEventArgs е) [0x00000] в System.Windows.Forms.Control.WmLButtonUp (System.Windows.Forms.Message & m) [0x00000] в System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message & m) [0x00000] в System.Windows.Forms.ComboBox + ComboListBox.WndProc (System.Windows.Forms.Message & m) [0x00000] в System.Windows.Forms.Control + ControlWindowTarget.OnMessage (System.Windows.Forms.Message & m) [0x00000] в System.Windows.Forms.Control + ControlNativeWindow.WndProc (System.Windows.Forms.Message & m) [0x00000] в System.Windows.Forms.NativeWindow.WndProc (IntPtr hWnd, Msg msg, IntPtr wParam, IntPtr lParam) [0x00000] в System.Windows.Forms.XplatUIX11.DispatchMessage (System.Windows.Forms.MSG & msg) [0x00000] в System.Windows.Forms.XplatUI.DispatchMessage (System.Windows.Forms.MSG & msg) [0x00000] в System.Windows.Forms.Application.RunLoop (Булев Модал, System.Windows.Forms.ApplicationContext контекст) [0x00000]

Любая помощь приветствуется Michael

UPDATE Это пример работающего MessageBox.Show в моем коде, который не вызывает ошибку:

GlobalConfig= new Dictionary<string, string>();
byte[] ConfigBytes= new byte[]{};
try{
    ConfigBytes= System.IO.File.ReadAllBytes("Config.cfg");
}catch{
    MessageBox.Show("Global ettings file does not exist. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    GlobalConfig.Add("StoreNumber","");
    GlobalConfig.Add("Error","Y");
}

Обновление обновления:

Кажется, проблема в том, что внутри события выпадающего списка есть MessageBox.Show: Следующий код по-прежнему представляет ту же ошибку:

private void Reports_GroupChanged(object sender,EventArgs e){
    MessageBox.Show("The file for this group is missing. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

Ответы [ 3 ]

1 голос
/ 20 марта 2009

Когда вы показываете MessageBox, он не приостанавливает ваше приложение. Вместо этого приложение продолжает качать сообщения из операционной системы. В действительности это позволяет вашему интерфейсу продолжить обработку.

Скорее всего, здесь происходит то, что, хотя MessageBox показывает, ComboBox все еще обрабатывает сообщение о нажатии кнопки мыши вверх и нулевую ссылку. Попробуйте вместо этого сделать следующий вызов.

System.Diagnostics.Debugger.Break();
0 голосов
/ 11 июля 2013

Прежде чем показывать сообщение, следует устранить проблему, вызвавшую сбой.

Ниже приведен мой пример.

Ошибка была вызвана преобразованием нулевого объекта в строку:

string str = dgv[e.ColumnIndex, e.RowIndex].Value.ToString();

Затем в операторе catch я попытался показать сообщение и присвоить предыдущее значение ячейке:

MessageBox.Show(String.Format("Value must be between {0} and {1}.", minVal, maxVal));
dgv[e.ColumnIndex, e.RowIndex].Value = previousValue;

Я получил исключение нулевой ссылки во время вызова MessageBox.

Поэтому необходимо было исправить значение ячейки перед вызовом MessageBox (поменять местами строки), и это работало как чудо.

0 голосов
/ 20 марта 2009

Сначала исправьте ошибки.

Reports_Group_Chooser.SelectedIndex= 0;
Reports_Group_Chooser.Items.RemoveAt(NewGroup);    
MessageBox.Show("The file for this group is missing. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...