Question

(VS2005, Net 2.0)

I ai une forme qui est affichée comme une boîte de dialogue en utilisant la méthode ShowDialog (). La propriété CancelButton du formulaire est définie sur un bouton sur le formulaire. Même si je mets le DialogResult de ce bouton Aucun, en cliquant sur le bouton ferme encore la boîte de dialogue. Je ne veux pas que cela se produise -. Je veux être en mesure de contrôler si le dialogue se ferme ou non

Ce problème ne se produit pas avec AcceptButton de la forme - avec DialogResult de ce bouton réglé sur aucune, je peux faire ce que le traitement est nécessaire, alors décider ou non de régler manuellement la DialogResult du formulaire pour l'amener à fermer

Je pensais que la propriété CancelButton était censé Soley pour indiquer le bouton qui devrait être « cliqué » si on appuie sur ESCAPE (autant que le AcceptButton n'est censé indiquer le bouton « clic » lorsque vous appuyez sur Entrée). Ai-je tort dans ce domaine? Ai-je manqué une autre raison ma forme ferme? Ou est-ce un bug?

Edit: code ajouté. Ceci est la forme de dialogue (forme 2) avec le bouton d'annulation (bouton 1). Le bouton d'annulation est seulement il n'a pas CancelButton, de la forme DialogResult réglé sur Annuler, mais en appuyant sur le bouton ferme toujours la forme

    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 );
    }
Était-ce utile?

La solution

Méfiez-vous également que le formulaire peut être fermé en appuyant sur Alt + F4 et en appuyant sur la touche X et les deux voies ne déclenchent pas le bouton d'annulation événement click.

À moins que vous manipulez ces situations ne serait-il préférable de suivre les conseils de slurdge et empêcher la forme de fermeture en cas de FormClosing.

Edit: Notez également que si vous changez le DialogResult du bouton sur Aucun dans la fenêtre Propriétés, vous modifiez à la valeur par défaut. Si la valeur est la valeur par défaut de la propriété, alors il ne sera pas persisté dans les * .Designer.cs. Même si elle était persistait le code d'initialisation du formulaire est placé dans le dernier * .Designer.cs et l'emporterait sur Néant avec Annuler en raison de la ligne:

this.CancelButton = this.button1;

Comme vous pouvez le vérifier dans le réflecteur de la ligne précédente fait ceci:

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

Vous pouvez revenir sur Aucun dans le constructeur après l'appel InitializeComponent ().

Autres conseils

Il semble que vous souhaitez effectuer la validation de la clôture du formulaire.
L'événement FormClosing est un ajustement parfait pour cela. Cela vous permettra d'avoir le même code pour contrôler à proximité ou non.
Il suffit de définir la propriété Cancel sur true pour empêcher la fermeture. Voir FormClosing .

Il est le comportement par défaut.

De MSDN:

Cette propriété vous permet de désigner une action par défaut de se produire lorsque l'utilisateur appuie sur la touche ESC dans votre application. Vous pouvez utiliser cette propriété pour permettre à l'utilisateur de naviguer rapidement une forme simple en leur permettant de simplement appuyer sur la touche ESC pour fermer une fenêtre sans engager des changements au lieu de cliquer manuellement sur le bouton cancel avec leur souris.

CancelButton propriété

Au lieu d'essayer de gérer cela en cas de Button_Click, gérer en cas 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
   }
}

Je gère mon Accept code bouton ici aussi, je suppose que quoi que ce soit! = DialogResult.OK est une annulation, mais vous pouvez faire tout ce qui est confortable pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top