Проблема с MessageBox.Show в улове

Когда я пытаюсь запустить следующий код, возникает необработанное исключение. После долгих настроек кода я обнаружил, что если закомментировать строку 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] в (оболочка, вызывающая удаленное взаимодействие с проверкой) System.Windows.Forms.ComboBox :DropDownListBoxFinished () в System.Windows.Forms.ComboBox+ComboListBox.HideWindow () [0x00000] в System.Windows.Forms.ComboBox+ComboListBox.OnMouseUp (System.Windows.Forms.MouseEventArgs e) [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]

Любая помощь оценена Майклом

ОБНОВЛЕНИЕ Это пример рабочего 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);
}

person redorkulated    schedule 20.03.2009    source источник
comment
Ваша ошибка связана с полем со списком, а не с окном сообщения. Проблема в том, что стек вызовов не содержит номеров строк. Это в WPF? АПС.НЕТ? форумы по винде?   -  person Tony    schedule 20.03.2009
comment
Извините, я действительно новичок в программировании на C #, что вы имеете в виду. Это в WPF? АПС.НЕТ? форумы по винде?   -  person redorkulated    schedule 20.03.2009


Ответы (3)


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

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

System.Diagnostics.Debugger.Break();
person JaredPar    schedule 20.03.2009
comment
Я поставил System.Diagnostics.Debugger.Break(); в коде после MessageBox, и я не получил ошибки, но я не хочу, чтобы программа просто останавливалась на этой ошибке :(. - person redorkulated; 20.03.2009
comment
@redorkulated, однако, это помогает сузить проблему. Попробуйте отключить ComboBox, прежде чем показывать окно сообщения. - person JaredPar; 20.03.2009
comment
хм, нет, отключил поле со списком в начале метода и все равно получил ту же ошибку. - person redorkulated; 20.03.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);    
person jyoung    schedule 20.03.2009
comment
Я поменял местами строки, как вы предложили, но это не имело значения. Эти две строки работают нормально, когда строка MessageBox раскомментирована, я получаю сообщение об ошибке. Я также переместил MessageBox в свой собственный сегмент после улова. if(ConfigBytes.Length == 0){ MsgBox... } По-прежнему возникает та же ошибка. - person redorkulated; 20.03.2009

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

Ниже мой пример.

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

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 (поменять строки местами), и это сработало как шарм.

person Elephant    schedule 11.07.2013