studio - evento validating c#
C#WinForms ErrorProvider Control (5)
Esta es una solución moderadamente complicada de la que estás hablando.
No hay forma de lograr esto automáticamente, que yo sepa.
Debe mantener un indicador para cada control y configurarlo manualmente cada vez que se parpadee un proveedor de errores.
Puede ser un Dictionary<TKey, TValue>
se puede utilizar para realizar un seguimiento de él.
¿Alguien sabe si hay una manera de obtener una lista de controles que tengan el ícono ErrorProvider activo? es decir. Cualquier control que haya fallado la validación. Estoy tratando de evitar bucle todos los controles en el formulario.
Me gustaría mostrar algún tipo de mensaje que indique cuántos errores hay en el formulario. Como mi formulario contiene pestañas, estoy intentando que el usuario tenga en cuenta que pueden existir errores en las pestañas inactivas y que deben revisar todas las pestañas.
Gracias
Barry
Esto cae en la categoría de "cómo no puedes saber". Es su código el que llama a ErrorProvider.SetError (), no debería tener problemas para rastrear cuántos errores siguen activos. Aquí hay una pequeña clase de ayuda, use su método SetError () para actualizar el ErrorProvider. Su propiedad Count devuelve el número de errores activos:
private class ErrorTracker {
private HashSet<Control> mErrors = new HashSet<Control>();
private ErrorProvider mProvider;
public ErrorTracker(ErrorProvider provider) {
mProvider = provider;
}
public void SetError(Control ctl, string text) {
if (string.IsNullOrEmpty(text)) mErrors.Remove(ctl);
else if (!mErrors.Contains(ctl)) mErrors.Add(ctl);
mProvider.SetError(ctl, text);
}
public int Count { get { return mErrors.Count; } }
}
Hoy tuve el mismo problema. Mi solución es extender el control ErrorProvider.
Vea el código a continuación:
public class MyErrorProvider : ErrorProvider
{
public List<Control> GetControls()
{
return this.GetControls(this.ContainerControl);
}
public List<Control> GetControls(Control ParentControl)
{
List<Control> ret = new List<Control>();
if (!string.IsNullOrEmpty(this.GetError(ParentControl)))
ret.Add(ParentControl);
foreach (Control c in ParentControl.Controls)
{
List<Control> child = GetControls(c);
if (child.Count > 0)
ret.AddRange(child);
}
return ret;
}
}
Puede usar la clase derivada anterior en su formulario y luego (diga que myErrorProvider es la instancia de clase en su formulario) puede obtener todos los controles con errores en su formulario, llamando a:
List<Control> errorControls = myErrorProvider.GetControls();
Simplemente haga que el proveedor de errores sea una variable global en lugar de una variable local
public partial class MainForm
{
ErrorProvider errorProvider1 = new ErrorProvider();
void Validate_Working()
{
errorProvider1.SetError(textbox1, "textbox is empty");
errorProvider1.Clear();
}
}
desde
public partial class MainForm
{
Void Validate_NotWorking()
{
ErrorProvider errorProvider1 = new ErrorProvider();
errorProvider1.SetError(textbox1, "textbox is empty");
errorProvider1.Clear();
}
}
Esto debería solucionar su problema, ya que probablemente haya estado eliminando sus errores de otro método como btnCancel_click. Esto me funcionó :)
Tiene que usar SetError para establecer el error en el control en primer lugar, ¿verdad? Tal vez debería almacenar esa información en otra colección al mismo tiempo si desea tenerla a mano. Por ejemplo, podría agregar cada control con un error a un hashset.