Вопрос

(VS2005, .Net 2.0)

У меня есть форма, которая отображается в виде диалогового окна с использованием метода ShowDialog().Свойству CancelButton формы присваивается значение кнопка в форме.Даже если я установлю для DialogResult этой кнопки значение None, нажатие кнопки все равно закроет диалоговое окно.Я не хочу, чтобы это происходило - я хочу иметь возможность контролировать, закрывается диалоговое окно или нет.

Эта проблема не возникает с AcceptButton формы - если для DialogResult этой кнопки установлено значение none, я могу выполнить необходимую обработку, а затем решить, следует ли вручную устанавливать DialogResult формы, чтобы вызвать ее закрытие.

Я думал, что свойство CancelButton предназначено исключительно для указания кнопки, на которую следует "нажать", если нажат Escape (так же, как AcceptButton должен указывать только на кнопку, которую нужно "нажать", когда нажат Enter).Ошибаюсь ли я в этом?Я пропустил какую-то другую причину, по которой моя форма закрывается?Или это ошибка?

Редактировать:Добавлен код.Это диалоговая форма (форма 2) с кнопкой отмены (кнопка 1).Кнопка отмены - это только кнопка отмены формы, для нее не установлено значение DialogResult "Отмена", но нажатие кнопки все равно закрывает форму

    private void InitializeComponent()
    {
        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // button1
        // 
        this.button1.Name = "button1";
        this.button1.Text = "button1";
        // 
        // Form2
        // 
        this.CancelButton = this.button1;
        this.Controls.Add( this.button1 );
        this.Name = "Form2";
        this.Text = "Form2";
        this.ResumeLayout( false );
    }
Это было полезно?

Решение

Также имейте в виду, что форма может быть закрыта нажатием Alt + F4 и кнопки X, и оба способа не вызовут событие отмены нажатия кнопки.

Если вы также не справляетесь с подобными ситуациями, не лучше ли было бы последовать совету slurdge и предотвратить закрытие формы в событии FormClosing .

Редактировать: Также обратите внимание, что если вы измените значение DialogResult кнопки обратно на None в окнах Свойств, вы измените его на значение по умолчанию.Если значение является значением свойства по умолчанию, то оно не будет сохранено в *.Designer.cs.Даже если бы он был сохранен, код инициализации формы помещался последним в *.Designer.cs и заменял бы значение None на Cancel из-за строки:

this.CancelButton = this.button1;

Как вы можете проверить в Reflector, предыдущая строка делает это:

public void set_CancelButton(IButtonControl value)
{
    base.Properties.SetObject(PropCancelButton, value);
    if ((value != null) && (value.DialogResult == DialogResult.None))
    {
        value.DialogResult = DialogResult.Cancel;
    }
}

Вы можете изменить его обратно на None в конструкторе после вызова InitializeComponent() .

Другие советы

Похоже, что вы хотите выполнить проверку закрытия формы.
Событие FormClosing идеально подходит для этого.Это позволило бы вам иметь один и тот же код для управления закрытием или нет.
Просто установите свойству Cancel значение true, чтобы предотвратить закрытие.Видишь Закрывающий форму.

Это поведение по умолчанию.

Из MSDN :

Это свойство позволяет вам назначить действие по умолчанию, которое будет выполняться, когда пользователь нажимает клавишу ESC в вашем приложении.Вы можете использовать это свойство, чтобы позволить пользователю быстро перемещаться по простой форме, позволяя ему просто нажимать клавишу ESC, чтобы закрыть окно без внесения изменений, вместо того, чтобы вручную нажимать кнопку отмены с помощью мыши.

Свойство CancelButton Отменить кнопку

Вместо того чтобы пытаться обработать это в событии button_click, обработайте это в событии form_closing .

MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
   if (DialogResult == DialogResult.Cancel)
   {
      // do my processing ...
      if (false)
         e.Cancel = true;   // stop the form from closing
   }
}

Здесь я также обрабатываю свой код кнопки "Принять", я принимаю все, что угодно != DialogResult .OK - это отмена, но вы можете делать все, что вам удобно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top