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, имейте в виду, что ее отладка может быть затруднена, если что-то идет не так (особенно, если вы относительно плохо знакомы с языком и структурой).