c # AcceptButton и проверка - PullRequest
       22

c # AcceptButton и проверка

23 голосов
/ 26 сентября 2010

Привет У меня есть форма, которая содержит несколько текстовых полей и две кнопки Отмена и ОК. Эти кнопки предназначены для принятия и отмены свойств кнопок в форме. Проблема в том, что мне нужно проверять тексты, введенные во все текстовые поля.

Я хочу сделать это, если пользователь нажмет кнопку Ok (которая является acceptButton). Поэтому я написал функцию, которая отвечает за проверку, и я запускаю эту функцию, если пользователь нажимает кнопку Ok. Проблема в том, что я не могу остановить закрытие формы, даже если функция проверки возвращает false. Это происходит из-за того, что я назначил свойство acceptbutto моей кнопке Ok. Есть ли способ предотвратить закрытие формы в случае сбоя проверки без удаления свойств acceptbutton ??

Ответы [ 5 ]

30 голосов
/ 28 июня 2011

Это рабочее решение, которое мы используем (и оно отчасти скомпилировано из других ответов).

Вам просто нужно установить DialogResult на None, чтобы форма не закрывалась.

//form init, auto-generated code (this is the case described)
private void InitializeComponent()
{
    //....
    this.AcceptButton = btnOk;
    this.btnOk.DialogResult = DialogResult.OK;
    //....
}

//event handlers
private void btnOK_Click(object sender, EventArgs e)
{
    if (!Validate())
        this.DialogResult = DialogResult.None;
}

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.None)
        e.Cancel = true;
}
6 голосов
/ 26 сентября 2010

Одним из способов может быть применение проверки в событии OnFormClosing и отмена действия на основе результата проверки.

- РЕДАКТИРОВАНИЕ -

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.OK)
    {
        if (!IsValid())
        {
            Info("Invalid data");
            e.Cancel = true;
        }
        else
        {
            Info("Valid data found, closing dialog");
        }
    }
    else if (this.DialogResult == DialogResult.Cancel)
    {
        Info("Just cancelling!");
    }
}

ИВы можете вызвать this.Close(); при событиях Отмена / Ок.

В качестве альтернативы, в своей реализации кнопки ОК вы можете изменить DialogResult кнопки и установить ее на None;

acceptButton.DialogResult = DialogResult.None;
6 голосов
/ 26 сентября 2010

В обработчике нажатия кнопки «ОК» измените DialogResult на DialogResult.None, если проверка не пройдена

1 голос
/ 26 сентября 2010

Не устанавливайте свойство AcceptButton в вашей форме и удалите свойство DialogResult из вашей кнопки (вместо этого установите DialogResult.None).

Вместо этого вы можете установить свойство DialogResult вашей формы в коде проверки.

 if (allFieldsValidated) {
     DialogResult = DialogResult.OK;
 }
0 голосов
/ 10 мая 2015

Не устанавливайте Button.DialogResult в конструкторе или где-либо еще (не путайте с Form.DialogResult).В обработчике нажатия кнопки выполните проверку, и в случае успеха установите Form.DialogResult в DialogResult.OK и закройте форму.

private void OkBtn_Click(object sender, EventArgs e)
{
    if (isValid())
    { 
      this.DialogResult = DialogResult.OK;
      this.Close();
    }
}
...