2010-09-26 18 views
22

Hola Tengo un formulario que contiene varios cuadros de texto y dos botones Cancelar y Aceptar. Estos botones están asignados para aceptar y cancelar propiedades de botones en la forma. El problema es que tengo que validar los textos ingresados ​​en todos los cuadros de texto.C# AcceptButton y validación

Quiero hacer eso si el usuario hace clic en el botón Ok (que es acceptButton). Así que escribí una función que es responsable de la validación y disparo esta función si el usuario hace clic en el botón Ok. El problema es que no puedo detener el cierre de la forma, incluso si la función de validación devuelve falso. Sucede debido al hecho de que le asigné la propiedad acceptbutto a mi botón Ok. ¿Hay alguna forma de evitar que el formulario se cierre si la validación falla sin eliminar las propiedades del botón Aceptar?

Respuesta

1

No configure la propiedad AcceptButton en su formulario y elimine la propiedad DialogResult de su botón (configúrela en DialogResult.None).

En su lugar, puede establecer la propiedad DialogResult de su formulario en su código de validación.

if (allFieldsValidated) { 
    DialogResult = DialogResult.OK; 
} 
+0

Estaba intentando esto antes pero este código no funciona. Si hago clic en el botón Ok y la validación devuelve true, no ocurre nada, sin embargo, si hago clic en el botón Ok una vez más, me cierro. – exMode

+0

@exMode: ¿Qué quiere decir que no pasa nada? ¿No entra en la validación? Cuando haya terminado de validar, ¿no puede establecer 'DialogResult' del formulario en' DialogResult.OK' y hacer que el formulario se cierre? – Patrick

+0

Quiero decir que la forma no se cierra incluso si la validación devuelve verdadero. Desafortunadamente, no puedo renunciar a marcar DialorResult.OK – exMode

5

Una forma podría ser la aplicación de la validación en el evento OnFormClosing y cancelar la acción basada en resultado de la validación.

--EDIT--

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (this.DialogResult == DialogResult.OK) 
    { 
     if (!IsValid()) 
     { 
      Info("Invalid data"); 
      e.Cancel = true; 
     } 
     else 
     { 
      Info("Valid data found, closing dialog"); 
     } 
    } 
    else if (this.DialogResult == DialogResult.Cancel) 
    { 
     Info("Just cancelling!"); 
    } 
} 

Y puede llamar this.Close(); en Cancelar/eventos Ok.

Como alternativa, en la implementación de su botón Aceptar puede cambiar el DialogResult del botón y configurarlo en None;

acceptButton.DialogResult = DialogResult.None; 
+0

el primer snipet funciona pero también impide que se cierre incluso si hace clic en el botón Cancelar – exMode

+0

@exMode: consulte mi código actualizado en función de su comentario. 'Info()' es solo un método que llama 'MessageBox' –

+0

Pero escuchar en el evento de cierre de formulario significa que usted configura el valor del resultado del diálogo, deja que el diálogo publique un envío de evento, luego se cancela y luego el resultado del diálogo del formulario es cambiado de nuevo a ninguno. ¿Por qué los pasos adicionales de escuchar Form.Close? Simplemente espere y establezca el valor de DialogResult cuando se valida, no todas las veces. – Patrick

5

En el clic de botón Ok controlador de cambios a DialogResult DialogResult.None cuando falla la validación

+0

no funciona :(La forma se está cerrando a pesar de que configuré DialorResult como dijiste – exMode

+1

Funciona para mí. Quizás exMode lo estableció accidentalmente en DialogResult.No, en lugar de DialogResult.None? –

28

Esta es la solución de trabajo que utilizamos (y que es un poco compilado a partir de otras respuestas).

Solo tiene que configurar el DialogResult en None para evitar que se cierre el formulario.

//form init, auto-generated code (this is the case described) 
private void InitializeComponent() 
{ 
    //.... 
    this.AcceptButton = btnOk; 
    this.btnOk.DialogResult = DialogResult.OK; 
    //.... 
} 

//event handlers 
private void btnOK_Click(object sender, EventArgs e) 
{ 
    if (!Validate()) 
     this.DialogResult = DialogResult.None; 
} 

private void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (this.DialogResult == DialogResult.None) 
     e.Cancel = true; 
} 
+1

Esto funcionó bien. –

+5

¿Es necesario tener FormClosing-EventHandler? Para mí, configurar DialogResult en None es suficiente. – NobodysNightmare

0

No coloque Button.DialogResult en el diseñador o en otro lugar (no confundir con Form.DialogResult). En el controlador de clic de Button, realice la validación y, si lo logra, configure Form.DialogResult en DialogResult.OK y cierre el formulario.

private void OkBtn_Click(object sender, EventArgs e) 
{ 
    if (isValid()) 
    { 
     this.DialogResult = DialogResult.OK; 
     this.Close(); 
    } 
} 
Cuestiones relacionadas