una - c#AcceptButton y validación
c# accept button (5)
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 las propiedades de los botones en forma. El problema es que tengo que validar los textos ingresados en todos los cuadros de texto.
Quiero hacer eso si el usuario hace clic en el botón Aceptar (que es acceptButton). Así que escribí una función que es responsable de la validación y la disparo si el usuario hace clic en el botón Aceptar. El problema es que no puedo evitar que el formulario se cierre incluso si la función de validación devuelve falso. Ocurre debido al hecho de que asigné la propiedad acceptbutto a mi botón Aceptar. ¿Hay alguna forma de evitar que la forma se cierre si falla la validación sin eliminar las propiedades de aceptar botón?
En el botón Aceptar, haga clic en el controlador cambiar DialogResult a DialogResult.None
cuando falla la validación
Esta es la solución de trabajo que utilizamos (y está compilada de otras respuestas).
Solo tiene que configurar 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;
}
No establezca la propiedad AcceptButton
en su formulario y elimine la propiedad DialogResult
de su botón ( DialogResult.None
en DialogResult.None
lugar).
Puede establecer la propiedad DialogResult de su formulario en su código de validación.
if (allFieldsValidated) {
DialogResult = DialogResult.OK;
}
Una forma podría ser aplicar la validación en el evento OnFormClosing y cancelar la acción en función del resultado de la validación.
--EDITAR--
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 puedes llamar a esto. this.Close();
en Cancelar / Ok eventos.
Alternativamente, en la implementación del botón Aceptar, puede cambiar el resultado del botón y establecerlo en None
;
acceptButton.DialogResult = DialogResult.None;
No establezca Button.DialogResult en el Diseñador ni en ningún otro lugar (no confunda con Form.DialogResult). En el controlador de clic del botón, haga la validación y, si tiene éxito, 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();
}
}