WinForms AcceptButton не работает? - PullRequest
       47

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

37 голосов
/ 28 января 2009

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

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

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

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

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. Почему это не работает?

Ответы [ 5 ]

55 голосов
/ 28 января 2009

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

50 голосов
/ 28 января 2009

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

this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
3 голосов
/ 21 мая 2010
1 голос
/ 07 ноября 2016

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

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

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 01 марта 2018

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

...