Domanda

(VS2005, .Net 2.0)

Ho una forma che viene visualizzato come una finestra utilizzando il metodo ShowDialog (). Proprietà CancelButton del form è impostata su un pulsante sul form. Anche se ho impostato DialogResult che del pulsante su Nessuno, fare clic sul pulsante chiude ancora la finestra di dialogo. Non voglio che questo accada -. Voglio essere in grado di controllare se la finestra di dialogo si chiude o no

Questo problema non si verifica con AcceptButton del modulo - con DialogResult di quel tasto impostato a nessuno, posso fare quello che il trattamento sia necessario, quindi decidere se impostare o meno manualmente DialogResult del form per indurlo a chiudere

Ho pensato che la proprietà CancelButton doveva soley per indicare il tasto che dovrebbe essere "cliccato" se viene premuto Escape (tanto quanto si suppone solo per indicare il pulsante per "click" quando viene premuto Invio l'AcceptButton). Mi sbaglio in questo? Ho perso qualche altra ragione mia forma sta chiudendo? O si tratta di un bug?

Modifica: Codice aggiunto. Questa è la forma di dialogo (modulo 2) con il pulsante di annullamento (tasto 1). Il pulsante Annulla solo CancelButton del modulo, non deve DialogResult impostare Per annullare, ma premendo il pulsante si chiude ancora la forma

    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 );
    }
È stato utile?

Soluzione

attenzione, inoltre, che la forma può essere chiusa premendo Alt + F4 e premendo il tasto X e in entrambe le direzioni non attivano la cancellazione dell'evento clic del pulsante.

A meno che guida anche le queste situazioni non sarebbe meglio seguire il consiglio di slurdge e prevenire il modulo di chiudere in caso FormClosing.

Modifica Si noti inoltre che se si cambia il DialogResult del pulsante indietro su Nessuno nelle finestre Proprietà, si modifica al valore di default. Se il valore è il valore predefinito della proprietà allora non verrà persistito nelle * .Designer.cs. Anche se fosse persistito il codice di inizializzazione modulo è posto ultimo in * .Designer.cs e sarebbe ignorare il Nessuno con Cancel a causa della linea:

this.CancelButton = this.button1;

Come è possibile controllare in Reflector riga precedente fa questo:

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

È possibile cambiare di nuovo su Nessuno nel costruttore dopo la chiamata InitializeComponent ().

Altri suggerimenti

Sembra che si desidera eseguire la convalida di chiusura Modulo.
L'evento FormClosing è una misura perfetta per questo. Ciò consentirebbe di avere lo stesso codice per controllare chiudere o no.
Basta impostare la proprietà Cancel su true per evitare la chiusura. Vedere FormClosing .

E 'il comportamento di default.

Da MSDN:

Questa proprietà consente di definire un'azione predefinita a verificarsi quando l'utente preme il tasto ESC nell'applicazione. È possibile utilizzare questa proprietà per consentire all'utente di navigare rapidamente una forma semplice, consentendo loro di premere semplicemente il tasto ESC per chiudere una finestra senza commettere modifiche invece di manualmente facendo clic sul pulsante Annulla con il mouse.

CancelButton Proprietà

Invece di cercare di gestire questo in caso Button_Click, gestirlo in caso 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
   }
}

gestisco il mio codice del pulsante Accept anche qui, suppongo niente! = DialogResult.OK è un annullare, ma si può fare tutto ciò che è comodo per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top