2009-11-20 3 views
4

(VS2005, .Net 2.0)C# CancelButton закрывает диалоговое окно?

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

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

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

Редактировать: Код добавлен. Это диалоговая форма (форма 2) с кнопкой отмены (кнопка 1). кнопка Отмена только CancelButton формы, а он не имеет 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); 
    } 
+1

Я думаю, вам нужно разместить код – ChrisF

ответ

7

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

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

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

this.CancelButton = this.button1; 

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

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

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

+0

Hm. Я бы спрятал кнопку X, но не понял, что Alt-F4 закроет диалог. Действительно, практическое решение slurdge кажется лучшим, но мне все еще интересно, почему/когда кнопка DialogResult устанавливается на Cancel, когда я изменил ее на None в дизайнере. – Rawling

+0

См. Редактирование моего ответа. –

+0

Я думаю, что ваше редактирование ближе всего объясняет, что происходит, а свойство CancelButton устанавливается во время выполнения, также устанавливая диалог DialogResult. Я все еще в темноте, почему это происходит, но, не спрашивая кого-то в Microsoft, я не уверен, что я получу ответ на это. – Rawling

2

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

Из MSDN:

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

CancelButton Property

+0

Я читал, что как «эта кнопка нажата, когда нажата Esc, и нажатие кнопки может включать закрытие формы», а не «эта кнопка нажата, когда Esc нажата, и мы сделайте кнопку, чтобы она сама закрыла форму ». – Rawling

+1

Вы проверили URL-адрес, он также содержит контент сообщества. [Я этого не заметил;)] Установка кнопки в качестве CancelButton в дизайнере Visual Studio также имеет побочный эффект от установки DialogResult кнопки Отмена. Для модального диалога это автоматически приведет к закрытию формы при нажатии кнопки. Чтобы предотвратить закрытие формы, очистите свойство DialogResult или используйте этот код в обработчике кликов: this.DialogResult = DialogResult.None; – Anuraj

+0

Хм. Я заметил, что установка CancelButton в дизайнере также устанавливает кнопку DialogResult для отмены. Однако, даже если вы измените диалоговое окно «Диалоговое окно» в «Дизайнере» на «Нет», оно все равно закрывает окно. На самом деле, когда я отлаживал отладку, я заметил, что даже не установил кнопку DialogResult на none в Designer - кнопка DialogResult на кнопке Cancel. Что здесь происходит? – Rawling

5

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

+1

Это удобно и, вероятно, что я в итоге сделаю. То, что меня действительно волнует, это то, почему кнопка вызывает закрытие формы, в первую очередь, когда я этого не говорил. – Rawling

+0

+1 Это то, что я делаю. – Hath

1

Вместо того чтобы пытаться справиться с этим в событии 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 
    } 
} 

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

Смежные вопросы