Perché il mio modulo tenta di eliminare quando accedo a ListBox.SelectedItem.ToString ()?
-
06-07-2019 - |
Domanda
Sto sviluppando un piccolo POS per un progetto universitario. Ho un modulo che funge da finestra principale POS, con un datagrid e così via. Inoltre, ho un modulo che è la ricerca sensibile o la ricerca incrementale e desidero che quel modulo selezioni un elemento in una casella di riepilogo e lo ritorni alla finestra principale. Ora ho una proprietà nel main che ottiene quell'elemento come una stringa e quando l'utente fa clic sul pulsante OK nel modulo di ricerca, voglio impostare quella proprietà nella finestra principale.
Tutto funziona alla grande tranne una cosa: quando provo ad accedere a listBox_Codigo.SelectedItem.ToString ();
l'app cerca di smaltire e chiude tutte le finestre ...
Qualcuno sa perché?
Ho solo bisogno della stringa selezionata in quella casella di elenco e impostarla sulla finestra principale in questo modo:
var Principal = (PDQ.Cajero)this.ParentForm;
Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString();
this.DialogResult = DialogResult.OK;
this.Close();
dove PDQ.Cajero
è il modulo principale, che chiama questo modulo.
AGGIORNAMENTO: ho appena terminato il debug e subito dopo il programma arriva
listBox_Codigo.SelectedItem.ToString ();
il programma passa a Dispose ()
.
AGGIORNAMENTO 2 Questo è il mio metodo completo:
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();
}
}
Quindi il problema non è se il valore è null ...
Soluzione
Probabilmente non è nessun SelectedItem
(il che significa che il valore della proprietà è null
). In questo caso il tuo codice lancia un NullReferenceException
, poiché non puoi chiamare una funzione su un riferimento null
. Poiché non lo stai rilevando, l'applicazione lo sta rilevando a un livello superiore nel tentativo di uscire. Questo è ciò che chiama il tuo metodo Dispose
.
Altri suggerimenti
Immagino che il modulo sia disponibile perché non stai gestendo un NullReferenceException
.
La mia regola generale per la gestione delle eccezioni nelle GUI è di avere un blocco try-catch in tutti i gestori di eventi che registra l'eccezione in un file e avvisa l'utente di un errore.
Cosa ottieni con questo codice?
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);
}
}