Pregunta

(VS2005, .Net 2.0)

Tengo una forma que se muestra como un cuadro de diálogo con el método ShowDialog (). CancelButton propiedad del formulario se establece en un botón en el formulario. Incluso si fijo DialogResult de ese botón para Ninguno, al hacer clic en el botón todavía cierra el diálogo. No quiero que esto suceda -. Quiero ser capaz de controlar si el diálogo se cierra o no

Este problema no se produce con AcceptButton de la forma - con DialogResult de ese botón establece en ninguno, no puedo hacer lo que el tratamiento sea necesario, y luego decidir si desea o no configurar manualmente DialogResult de la forma para hacer que se cierre

Me pareció la propiedad CancelButton estaba destinado Soley para indicar el botón que debe ser "clic" si se pulsa Escape (tanto como el AcceptButton solamente se supone que indica el botón para hacer "clic" cuando se pulsa ENTER). Estoy equivocado en esto? ¿Me he perdido alguna otra razón mi forma está cerrando? O se trata de un error?

Editar: Código añadió. Esta es la forma de diálogo (forma 2) con el botón cancelar (botón 1). El botón de cancelación sólo es CancelButton de la forma, que no tiene DialogResult establece en Cancelar, pero al presionar el botón todavía se cierra el formulario

    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 );
    }
¿Fue útil?

Solución

También ten en cuenta que el formulario se puede cerrar pulsando Alt + F4 y pulsando el botón X y en ambos sentidos no activarán el evento de clic de botón cancelar.

A menos que también están manejando estas situaciones, ¿no sería mejor seguir el consejo de slurdge y prevenir la forma de cierre en caso FormClosing.

Editar También tenga en cuenta que si cambia el DialogResult del botón de retroceso en Ninguno en las ventanas de propiedades, se cambian al valor predeterminado. Si el valor es el valor predeterminado de la propiedad, entonces no se persistió en los .Designer.cs *. Incluso si se persistía el código del formulario de inicialización se coloca en el último * .Designer.cs y anularía la Nada con Cancelar debido a la línea:

this.CancelButton = this.button1;

Como se puede comprobar en la línea anterior del reflector hace esto:

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

Puede cambiarlo de nuevo en Ninguno en el constructor después de la llamada InitializeComponent ().

Otros consejos

Parece que desea realizar la validación del formulario de cierre.
El evento FormClosing es un ajuste perfecto para esto. Esto le permitirá tener el mismo código para controlar de cerca o no.
Sólo hay que establecer el Cancelar propiedad en true para evitar el cierre. Ver FormClosing .

Es el comportamiento por defecto.

A partir de MSDN:

Esta propiedad le permite designar una acción predeterminada que ocurra cuando el usuario presiona la tecla ESC en su aplicación. Puede utilizar esta propiedad para permitir al usuario navegar rápidamente una forma sencilla por lo que les permite simplemente pulse la tecla ESC para cerrar una ventana sin confirmar los cambios manualmente en lugar de hacer clic en el botón de cancelación con su ratón.

CancelButton propiedad

En lugar de tratar de manejar esto en caso Button_Click, manejarlo en 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
   }
}

Yo manejo mi Acepta el código del botón aquí también, supongo nada! = DialogResult.OK es una cancela, pero se puede hacer lo que sea cómodo para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top