2009-10-27 8 views
-1

Je développe un petit point de vente pour un projet universitaire. J'ai un formulaire qui agit comme une fenêtre principale de POS, avec une grille de données et ainsi de suite. En outre, j'ai un formulaire qui est la recherche sensible ou la recherche incrémentale, et je veux que ce formulaire, sélectionnez un élément dans une liste et le renvoyer à la fenêtre principale. Maintenant, j'ai une propriété dans le principal qui obtient cet élément sous forme de chaîne, et lorsque l'utilisateur clique sur le bouton OK sur le formulaire de recherche, je veux définir cette propriété sur la fenêtre principale.Pourquoi mon formulaire Essayez de Evacuer lors de l'accès ListBox.SelectedItem.ToString()?

Tout fonctionne très bien, sauf une chose: quand j'essaie d'accéder listBox_Codigo.SelectedItem.ToString(); l'application essaie de disposer et ferme toutes les fenêtres ... Quelqu'un sait-il pourquoi?

J'ai juste besoin la chaîne sélectionnée dans cette zone de liste et le mettre à la fenêtre principale comme ceci:

var Principal = (PDQ.Cajero)this.ParentForm; 
       Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString(); 
       this.DialogResult = DialogResult.OK; 
       this.Close(); 

PDQ.Cajero est la principale forme, qui appelle ce formulaire.

MISE À JOUR: Je viens de terminer le débogage, et juste après le programme arrive à listBox_Codigo.SelectedItem.ToString(); le programme saute à Dispose().

MISE À JOUR 2 Ceci est ma méthode complète:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (listBox_Codigo.SelectedItem == null) 
     { 
      if (MessageBox.Show(this, "No se puede ingresar un producto sin seleccionarlo.\n ¿Desea intentarlo de nuevo, o Salir?", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel) 
      { 
       DialogResult = DialogResult.Cancel; 
       this.Close(); 
      } 
     } 
     else 
     { 
      var Principal = (PDQ.Cajero)this.ParentForm; 
      Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString(); 
      this.DialogResult = DialogResult.OK; 
      this.Close(); 

     } 
    } 

Le problème est donc pas si la valeur est nulle ...

+1

Est-ce que SelectedItem est null? –

+0

Mise à jour de la question. Il ne peut pas être nul parce que j'ai déjà vérifié le code – josecortesp

+0

Étant donné le code, le principal est-il null? –

Répondre

4

Il est probable pas SelectedItem (ce qui signifie que le valeur de la propriété est null). Dans ce cas, votre code est de lancer une NullReferenceException, puisque vous ne pouvez pas appeler une fonction sur une référence null. Parce que vous ne l'attrapez pas, l'application l'attrape à un niveau supérieur et tente de quitter. C'est ce qui appelle votre méthode Dispose.

+0

Oh, d'accord. On dirait que ce fixer ... Désolé de ne pas voir dans un premier temps ... Merci les gars – josecortesp

+0

Si votre problème que ce soit réglé, je vous en serais reconnaissant marqué comme la réponse. Merci! –

1

Je suppose que la forme est mise au rebut parce que vous n'êtes pas la manipulation d'un NullReferenceException. Ma règle générale pour la gestion des exceptions dans les GUI est d'avoir un bloc try-catch dans tous les gestionnaires d'événements qui enregistre l'exception dans un fichier et notifie l'erreur à l'utilisateur.

Qu'est-ce que vous obtenez avec ce code?

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     if (listBox_Codigo.SelectedItem == null) 
     { 
      if (MessageBox.Show(this, "No se puede ingresar un producto sin seleccionarlo.\n ¿Desea intentarlo de nuevo, o Salir?", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel) 
      { 
       DialogResult = DialogResult.Cancel; 
       this.Close(); 
      } 
     } 
     else 
     { 
      var Principal = (PDQ.Cajero)this.ParentForm; 
      Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString(); 
      this.DialogResult = DialogResult.OK; 
      this.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
     //LogException(ex); 
    } 
} 
+0

Essayez les blocs catch ne sont pas à des fins de débogage. Au contraire, dans VS, vous sélectionnez Debug-> Exceptions et assurez-vous de voir tout ce qui est lancé. – kubal5003

+0

Ils seront nécessaires dans la production de toute façon, vous pouvez aussi bien les utiliser en développement. –

+0

@ kubal5003 S'il est plus rapide et/ou plus facile de l'envelopper dans un try/catch pour trouver l'erreur, pourquoi ne pas l'utiliser (et si vous ne voulez vraiment pas un try/catch supprimer après avoir trouvé le problème?) Cela ressemble à un gâchis d'ignorer un outil qui peut gagner du temps et de l'énergie –