2009-03-20 8 views
1

Lorsque j'essaie d'exécuter le code suivant Il provoque une exception non gérée. Après beaucoup de tweeking avec le code que j'ai trouvé si mis en commentaire la ligne MessageBox.Show le problème s'en va! J'ai rarement utilisé les messages MessageBox.Show dans d'autres segments catch {} dans d'autres parties du code sans problème. Ma question est de savoir pourquoi il provoque l'exception?Problème avec MessageBox.Show dans la capture

(Ps Reports_Group_Chooser est un ComboBox)

Le code:

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; 
} 

L'erreur (bien la plus grande partie):

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object at System.Windows.Forms.ComboBox.DropDownListBoxFinished () [0x00000] at (wrapper remoting-invoke-with-check) System.Windows.Forms.ComboBox:DropDownListBoxFinished () at System.Windows.Forms.ComboBox+ComboListBox.HideWindow () [0x00000] at System.Windows.Forms.ComboBox+ComboListBox.OnMouseUp (System.Windows.Forms.MouseEventArgs e) [0x00000] at System.Windows.Forms.Control.WmLButtonUp (System.Windows.Forms.Message& m) [0x00000] at System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message& m) [0x00000] at System.Windows.Forms.ComboBox+ComboListBox.WndProc (System.Windows.Forms.Message& m) [0x00000] at System.Windows.Forms.Control+ControlWindowTarget.OnMessage (System.Windows.Forms.Message& m) [0x00000] at System.Windows.Forms.Control+ControlNativeWindow.WndProc (System.Windows.Forms.Message& m) [0x00000] at System.Windows.Forms.NativeWindow.WndProc (IntPtr hWnd, Msg msg, IntPtr wParam, IntPtr lParam) [0x00000] at System.Windows.Forms.XplatUIX11.DispatchMessage (System.Windows.Forms.MSG& msg) [0x00000] at System.Windows.Forms.XplatUI.DispatchMessage (System.Windows.Forms.MSG& msg) [0x00000] at System.Windows.Forms.Application.RunLoop (Boolean Modal, System.Windows.Forms.ApplicationContext context) [0x00000]

Toute aide appréciée Michael

UPDATE Ceci est un exemple de fa MessageBox.Show travaillant dans mon code qui ne provoque pas une erreur:

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"); 
} 

mise à jour de mise à jour:

Il semble que le problème est juste d'avoir le MessageBox.Show dans un événement combobox: Le code suivant encore présente la même erreur:

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); 
} 
+0

Vous erreur est avec la zone de liste déroulante pas la boîte de message. Le problème est que la pile d'appel ne contient pas les numéros de ligne. Est-ce que c'est dans WPF? APS.NET? Forums Windows? – Tony

+0

Désolé, je suis vraiment nouveau à la programmation C# que voulez-vous dire "Est-ce dans les forums WPF? APS.NET? Windows?" – redorkulated

Répondre

1

Lorsque vous affichez un MessageBox, il ne met pas votre application en pause. Au lieu de cela, l'application continue de pomper les messages du système d'exploitation. En affect, cela permet à votre interface utilisateur de continuer le traitement.

Ce qui est susceptible de se produire ici, c'est que lorsque le MessageBox est en cours d'affichage, le ComboBox traite toujours le message du bouton de la souris et le référencement null. Essayez de mettre l'appel suivant à la place.

System.Diagnostics.Debugger.Break(); 
+0

Je mets le System.Diagnostics.Debugger.Pause(); dans le code après le MessageBox et je n'ai reçu aucune erreur mais je ne veux pas que le programme s'arrête juste sur cette erreur :(. – redorkulated

+0

@redorkulated, il aide à affiner le problème si. Essayez de désactiver la ComboBox avant d'afficher la boîte de message – JaredPar

+0

hmm nope a désactivé la combobox au début de la méthode et a toujours la même erreur – redorkulated

0

Corrigez les erreurs en premier.

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);  
+0

J'ai inversé les lignes comme vous le suggérez mais cela ne fait aucune différence Ces deux lignes fonctionnent bien quand la ligne MessageBox est décommentée erreur. J'ai aussi déplacé MessageBox à son propre segment après la prise. if (ConfigBytes.Length == 0) { MsgBox ...} Toujours est venu avec la même erreur. – redorkulated

0

Vous devez résoudre le problème à l'origine de l'erreur avant d'afficher un message.

Voici mon exemple.

L'échec a été causé par la conversion objet nul à la chaîne:

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

Puis, dans l'instruction catch j'ai essayé de montrer un message et attribuer une valeur précédente à la cellule:

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

Je suis null exception de référence lors de l'appel de MessageBox.

Il était donc nécessaire de fixer la valeur de la cellule avant d'appeler MessageBox (permuter les lignes) et cela a fonctionné comme un charme.

Questions connexes