WinForms AcceptButton не работает?

Хорошо, это меня беспокоит, и я просто не могу понять, что не так ...

Я сделал две формы. На первой форме просто есть простая кнопка, которая открывает другую в виде диалогового окна, например:

using (Form2 f = new Form2())
{
    if (f.ShowDialog() != DialogResult.OK)
        MessageBox.Show("Not OK");
    else
        MessageBox.Show("OK");
}

На втором, Form2, есть две кнопки. Все, что я сделал, это установил формы AcceptButton на одну, а CancelButton на другую. В моей голове это все, что нужно для работы. Но когда я запускаю его, я нажимаю кнопку, которая открывает Form2. Теперь я могу щелкнуть по кнопке CancelButton и получить сообщение «Not OK». Но когда я нажимаю на кнопку, установленную как AcceptButton, ничего не происходит? Код InitializeComponent формы 2 выглядит так:

private void InitializeComponent()
{
    this.button1 = new System.Windows.Forms.Button();
    this.button2 = new System.Windows.Forms.Button();
    this.SuspendLayout();
    // 
    // button1
    // 
    this.button1.Location = new System.Drawing.Point(211, 13);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(75, 23);
    this.button1.TabIndex = 0;
    this.button1.Text = "button1";
    this.button1.UseVisualStyleBackColor = true;
    // 
    // button2
    // 
    this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
    this.button2.Location = new System.Drawing.Point(130, 13);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(75, 23);
    this.button2.TabIndex = 1;
    this.button2.Text = "button2";
    this.button2.UseVisualStyleBackColor = true;
    // 
    // Form2
    // 
    this.AcceptButton = this.button1;
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.CancelButton = this.button2;
    this.ClientSize = new System.Drawing.Size(298, 59);
    this.Controls.Add(this.button2);
    this.Controls.Add(this.button1);
    this.Name = "Form2";
    this.Text = "Form2";
    this.Load += new System.EventHandler(this.Form2_Load);
    this.ResumeLayout(false);
}

Я ничего не сделал, кроме как добавил эти две кнопки и установил AcceptButton и CancelButton. Почему не работает?


person Svish    schedule 28.01.2009    source источник


Ответы (5)


Просто установить AcceptButton / CancelButton недостаточно. Это просто говорит, какая кнопка должна быть вызвана при Enter / Esc. Вы должны установить DialogResult в обработчике кнопок.

person Martin Moser    schedule 28.01.2009
comment
Что довольно странно, так это то, что установка CancelButton фактически устанавливает DialogResult этой кнопки на Cancel, но AcceptButton не делает то же самое для этой кнопки. - person Carl; 28.01.2009
comment
Аааааа. Спасибо!! Меня это реально беспокоило, ха-ха. Вы были абсолютно правы. для кнопки «Отмена» было установлено значение «Отмена», а для другой - нет. Совсем не подумал об этом свойстве dialogresult ... да ладно. Еще раз спасибо :) - person Svish; 28.01.2009
comment
Результат диалога настроен на отмену, потому что это значение по умолчанию - person Martin Moser; 29.01.2009
comment
Это только я или кнопка «Принять» закрывает форму только в том случае, если для DialogResult установлено значение «ОК»? - person Andriy K; 17.09.2014
comment
Да, кнопка «Принять» также закрывает форму @AndriyK - person Kamran Kia; 02.12.2019

Попробуйте установить DialogResult на button1

this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
person Samuel    schedule 28.01.2009
comment
Мне ваш ответ нравится больше, чем принятый, потому что вы точно указываете, что нужно сделать. (За исключением путаницы button1 vs. button2 :-) - person RenniePet; 23.05.2012

Обязательно попробуйте учебник Как легко применить AcceptButton и CancelButton для настраиваемого диалогового окна в Winform.

person user344760    schedule 21.05.2010
comment
Похоже, что DialogResult должен быть установлен на OK, прежде чем переходить к подпрограмме щелчка. - person Marco Guignard; 21.04.2016

У меня была проблема с неработающей кнопкой AcceptButton, и хотя предложение DialogResult было частью исправления, у меня было еще 2 вещи, которые нужно было изменить:

  1. Моя кнопка не была видна - намеренно, потому что я хотел остановить "дребезг" при "нажатии" возврата каретки путем сканирования штрих-кода.
  2. Контейнер, внутри которого находилась кнопка, имел значение. Он должен был находиться в том же контейнере, в моем случае Forms.Panel, что и текстовое поле, которое пыталось получить к нему доступ. Я не уверен, почему это имеет значение, но это имело значение.

Я надеюсь, что это помогает кому-то.

person Ads    schedule 06.11.2016

Для свойства KeyPreview формы необходимо установить значение True, значение по умолчанию - False. Помните, что если фокус установлен на любую другую кнопку, а не на AcceptButton, клавиша Enter выполнит эту кнопку.

person Khaled Eleftawi    schedule 01.03.2018
comment
он может работать с ложным свойством KeyPreview. Но для меня свойство TabIndex определило, какую кнопку следует нажимать. - person user2455111; 04.10.2018