Visual Studio C# DialogResult не работает

Я использую Visual Studio 2010frmMain имеет кнопку "Зарегистрироваться", которая вызывает другую форму newReg

Это код кнопки в frmMain это вызывает вторую форму. Проблема в том, что MessageBox("So Far So Good") никогда не звонят. dialogResult кажется, не признается.

private void btnRegisterNew_Click(object sender, EventArgs e)
{
   // newReg Constructor Call
   newReg = new frmRegisterNew();

   // show form
   newReg.Show();

   if (newReg.DialogResult.Equals(DialogResult.OK)) 
   {
      MessageBox.Show ("So Far So Good");
   }
}

Вторая форма имеет несколько полей для заполнения и кнопку "зарегистрироваться". Я установил dialogResult этой кнопки, чтобы "ОК" в окне свойств, а также, я думаю, в коде. При нажатии кнопки "зарегистрироваться" во второй форме он проверяет ввод, пытается обновить базу данных и закрывается в случае успеха. Вот этот фрагмент кода:

dbConnection db = new dbConnection();
db.dbConnect();
if (db.dbRegisterVehicle(txtNewReg.Text, txtNewMake.Text, txtNewModel.Text, txtNewColour.Text, OwnerID))
{
   // if insert worked close
   this.DialogResult = DialogResult.OK;
   this.Close();
}
db.dbDisconnect();

Я уверен, что попробовать, или что я мог бы посмотреть.

4 ответа

Решение

Использование ShowDialog

newReg = new frmRegisterNew();
var dialogResult = newReg.ShowDialog();

if(dialogResult==DialogResult.OK)
{
    ....
}

ShowDialog метод хороший путь, но помните о различиях между Show а также ShowDialog, Последний будет modal Это означает, что вы не можете получить доступ к своей исходной форме, пока новая форма не будет закрыта. Вот почему он блокирует проверку и может или не может быть то, что вы хотите.

Когда вы звоните Showне блокируется, поэтому ваш код сразу проверял, DialogResult был равен OK (это не было равно OK потому что ваша новая форма едва открылась к моменту проверки).

Альтернатива использованию ShowDialog, если вы хотите использовать Showдля обработки новой формы closed событие.

frmRegisterNew newReg = new frmRegisterNew();    
newReg.FormClosed += (s, o) =>
    {
        if (newReg.DialogResult == DialogResult.OK)
        {
            MessageBox.Show ("So Far So Good");
        }
    };
newReg.Show();

Это означает, что ваш код будет продолжать работать, и ваша новая форма не будет модальной, но когда новая форма закроется, FormClosed обработчик события будет запущен. Не беспокойтесь, если вы не знакомы с нотацией обработчика событий выше (они называются анонимными методами), но вы все равно можете использовать обработчик событий как обычно.

newReg.FormClosed += new FormClosedEventHandler(newReg_FormClosed);

void newReg_FormClosed(object sender, FormClosedEventArgs e)
{
    MessageBox.Show ("So Far So Good");
}

Попробуйте создать экземпляр класса DialogResult и использовать его следующим образом:

DialogResult dr = new DialogResult();

newReg = new frmRegisterNew();
dr = frmResgisterNew.ShowDialog();
if ( dr == DialogResult.OK )
   //Take an action here.

Form.Show() не блокирует и вернется очень быстро. Ваш чек на newReg.DialogResult.Equals(DialogResult.OK)) поэтому произойдет до того, как пользователь сможет нажать кнопку. Кроме того, обратите внимание на это предупреждение о закрытии окна:

Если форма отображается как немодальное окно, значение, возвращаемое свойством DialogResult, может не возвращать значение, назначенное форме, поскольку ресурсы формы автоматически высвобождаются при закрытии формы.

(через страницу библиотеки msdn свойства Form.DialogResult)

Вы можете позвонить From.ShowDialog() или, если вам нужно сохранить взаимодействие в главной форме, передайте делегат для вызова другой формы, когда она будет завершена.


Изменить: пару моментов, которые нужно иметь в виду:

  • В дополнение к приведенному выше предупреждению о закрытии формы вы должны быть осторожны при попытке доступа к содержимому из метода, отправленного из newRegцикл сообщений (включая функцию, которая вызвала Close()) после того, как он был утилизирован.

  • Если вы в конечном итоге с помощью ShowDialog() вместо Show(), тем не мение, this.Close() не будет распоряжаться формой. На самом деле, это по сути ничего не делает, так как настройка DialogResult к чему-либо кроме None автоматически скроет форму. Если вам нужна детерминированная очистка (вероятно, почему вы звоните Close() во-первых), вы должны позвонить newReg.Dispose() после того, как вы закончите с этим в btnRegisterNew_Click, В противном случае форма будет удалена в какое-то непредсказуемое время в будущем (при условии, что ваше приложение не завершится ненормально в промежуточный период).

  • Если вы используете анонимную функцию, упомянутую в keyboardP, имейте в виду, что ее отладка может быть затруднена, если что-то идет не так (особенно, если вы относительно плохо знакомы с языком и структурой).

Другие вопросы по тегам