Запретить возвращение ShowDialog() при нажатии кнопки OK
У меня есть диалог, который я хочу запретить закрывать при нажатии кнопки OK, но он возвращается, и что даже если для свойства AcceptButton установлено значение none вместо моей кнопки OK. Каков наилучший способ остановить его от закрытия?
Ответы
Ответ 1
Фактически вы меняете неправильное свойство. Вы действительно хотите AcceptButton
быть кнопкой OK. Это свойство определяет, какая кнопка по умолчанию в терминах Windows. Это кнопка, которая нажата, когда вы нажимаете ENTER на клавиатуре. Изменяя AcceptButton
, вы просто нарушаете интерфейс клавиатуры в своем диалоговом окне. Вы никоим образом не влияете на то, что происходит при нажатии кнопки.
Что вам нужно сделать, это установить свойство DialogResult
вашей кнопки на DialogResult.None
, так как это определяет, есть ли кнопка пресса закрывает форму. Затем внутри обработчика нажатия кнопки вам нужно решить, как реагировать на нажатие кнопки. Я ожидаю, что если проверка диалога будет успешной, вы должны закрыть диалоговое окно, установив свойство DialogResult
. Например
private void OKbuttonClick(object sender, EventArgs e)
{
if (this.CanClose())
this.DialogResult = DialogResult.OK;
}
Ответ 2
Лучший способ остановить это поведение - изменить свойство DialogResult кнопки OK на DialogResult.None
в окне свойств во время разработки.
Кроме того, если у вас уже есть код в событии click кнопки OK, вы можете изменить форму DialogResult.
private void comOK_Click(object sender, EventArgs e)
{
// your code .....
// Usually this kind of processing is the consequence of some validation check that failed
// so probably you want something like this
if(MyValidationCheck() == false)
{
// show a message to the user and then stop the form closing with
this.DialogResult = DialogResult.None;
}
}
Ответ 3
Вам нужно удалить DialogResult
самой кнопки, а в окне свойств на кнопке установите ее на None
.
http://msdn.microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx
Если для этого свойства DialogResult установлено значение, отличное от Нет, и если родительская форма отображалась через ShowDialog метод, нажатие кнопки закрывает родительскую форму без вашего для подключения любых событий.
Очевидно, теперь ваша кнопка ничего не сделает, поэтому вам нужно будет зарегистрировать обработчик для события Click
.
Ответ 4
Лучшей практикой является установка кнопки Ok для отключения, а не ответа на ввод пользователя.
Свойство DialogResult ДОЛЖНО быть установлено на Ok или Yes в зависимости от формы, и AcceptButton также должен быть связан с Ok.
Обычно я создаю функцию во всех диалогах и вызываю ее всякий раз, когда пользователь взаимодействует с данными.
void RefreshControls()
{
button.Enabled = this.ValidateInput();
}
Ответ 5
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form2 fLogin = new Form2();
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new Form1());
}
else
{
Application.Exit();
}
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnKlik_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}