web-dev-qa-db-fra.com

WinForms AcceptButton ne fonctionne pas?

Ok, ça me dérange, et je n'arrive pas à comprendre ce qui ne va pas ...

J'ai fait deux formes. La première forme a juste un simple bouton dessus, qui ouvre l’autre comme un dialogue comme ceci:

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

Le second, qui est ce Form2, a deux boutons dessus. Tout ce que j'ai fait est de définir les formes AcceptButton à un, et CancelButton à l'autre. Dans ma tête, c'est tout ce qui devrait être nécessaire pour que cela fonctionne. Mais quand je le lance, je clique sur le bouton qui ouvre Form2. Je peux maintenant cliquer sur celui défini en tant que CancelButton et je reçois la boîte de message "Pas OK". Mais lorsque je clique sur celui défini en tant que AcceptButton, rien ne se passe? Le code InitializeComponent de Form2 ressemble à ceci:

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);
}

Je n'ai rien fait d'autre que d'ajouter ces deux boutons et de définir AcceptButton et CancelButton. Pourquoi ça ne marche pas?

36
Svish

Le simple fait de définir AcceptButton/CancelButton ne suffit pas. Cela indique simplement quel bouton doit être invoqué sur Enter/Esc. Vous devez définir DialogResult dans le gestionnaire de boutons.

55
Martin Moser

Essayez de définir DialogResult sur button1

this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
50
Samuel
3
user344760

J'avais un problème avec AcceptButton qui ne fonctionnait pas et bien que la suggestion de DialogResult faisait partie du correctif, il me restait 2 autres choses à changer:

  1. Mon bouton n'était pas visible - intentionnellement parce que je voulais arrêter le "Ding" lorsqu'un "retour chariot" était "appuyé" en balayant un code à barres.
  2. Le conteneur dans lequel se trouvait le bouton faisait toute la différence. Je devais l'avoir dans le même conteneur, dans mon cas un Forms.Panel, que la zone de texte qui essayait d'y accéder. Je ne sais pas pourquoi cela ferait une différence, mais c'est ce qui s'est passé.

J'espère que ça aidera quelqu'un.

1
Ads

Vous devez définir la propriété KeyPreview du formulaire sur True. La valeur par défaut est False. Rappelez-vous que si le focus est défini sur un autre bouton plutôt que sur le bouton AcceptButton, la touche Entrée exécutera ce bouton.

0
Khaled Eleftawi