Почему моя форма пытается избавиться при доступе к ListBox.SelectedItem.ToString ()? - PullRequest
0 голосов
/ 27 октября 2009

Я разрабатываю небольшую POS для университетского проекта. У меня есть форма, которая действует как главное окно POS, с сеткой данных и так далее. Кроме того, у меня есть одна форма, которая является чувствительным поиском или добавочным поиском, и я хочу, чтобы эта форма выбрала один элемент в списке и вернула его в главное окно. Теперь у меня есть свойство main, которое получает этот элемент в виде строки, и когда пользователь нажимает кнопку «ОК» в форме поиска, я хочу установить это свойство в главном окне.

Все отлично работает, кроме одного: когда я пытаюсь получить доступ к listBox_Codigo.SelectedItem.ToString(); приложение пытается утилизировать и закрывает все окна ... Кто-нибудь знает почему?

Мне просто нужна выделенная строка в этом списке и установите ее в главном окне следующим образом:

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

где PDQ.Cajero - это основная форма, которая вызывает эту форму.

ОБНОВЛЕНИЕ: Я только что закончил отладку, и сразу после того, как программа доберется до listBox_Codigo.SelectedItem.ToString(); программа переходит на Dispose().

ОБНОВЛЕНИЕ 2 Это мой полный метод:

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();

        }
    }

Так что проблема не в том, что значение равно нулю ...

Ответы [ 2 ]

4 голосов
/ 27 октября 2009

Там, вероятно, равно нет SelectedItem (что означает, что значение свойства равно null). В этом случае ваш код выбрасывает NullReferenceException, так как вы не можете вызвать функцию по ссылке null. Поскольку вы не перехватываете его, приложение перехватывает его на более высоком уровне, пытаясь выйти. Это то, что вызывает ваш Dispose метод.

1 голос
/ 27 октября 2009

Я бы предположил, что форма избавляется, потому что вы не обрабатываете NullReferenceException.

Мое общее практическое правило для обработки исключений в графических интерфейсах состоит в том, чтобы во всех обработчиках событий был блок try-catch, который регистрирует исключение в файле и уведомляет пользователя об ошибке.

Что вы получаете с этим кодом?

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