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 ...

È stato utile?

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);
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top