C# WinForms ErrorProvider Control
Кто-нибудь знает, есть ли способ получить список элементов управления, у которых активен значок ErrorProvider. то есть. любые элементы управления, которые не прошли проверку. Я пытаюсь избежать зацикливания всех элементов управления в форме.
Я хотел бы отобразить какое-то сообщение, указывающее, сколько ошибок в форме. Поскольку моя форма содержит вкладки, я пытаюсь сделать так, чтобы пользователю было очевидно, что на неактивных вкладках могут существовать ошибки, и им необходимо проверить все вкладки.
Спасибо
Барри
5 ответов
Это относится к категории "как можно не знать". Это ваш код, который вызывает ErrorProvider.SetError(), у вас не должно быть проблем с отслеживанием того, сколько ошибок все еще активно. Вот небольшой вспомогательный класс, используйте его метод SetError () для обновления ErrorProvider. Его свойство Count возвращает количество активных ошибок:
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; } }
}
Сегодня у меня была такая же проблема. Мое решение состоит в том, чтобы расширить элемент управления ErrorProvider.
Смотрите код ниже:
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;
}
}
Вы можете использовать вышеупомянутый производный класс в своей форме, а затем (скажем, что myErrorProvider является экземпляром класса в вашей форме) вы можете получить все элементы управления с ошибками в вашей форме, вызвав:
List<Control> errorControls = myErrorProvider.GetControls();
Это умеренно сложное решение, о котором вы говорите.
Насколько я знаю, нет способа достичь этого автоматически.
Вы должны поддерживать флаг для каждого элемента управления и вручную устанавливать его каждый раз, когда мигает поставщик ошибок.
Может быть Dictionary<TKey, TValue>
может быть использован для отслеживания этого.
Вы должны использовать SetError, чтобы сначала установить ошибку на элементе управления, верно? Возможно, вам следует хранить эту информацию в другой коллекции одновременно, если вы хотите, чтобы она была под рукой. Например, вы можете добавить каждый элемент управления с ошибкой в хэш-набор.
Просто сделайте провайдер ошибок в качестве глобальной переменной, а не локальной переменной
public partial class MainForm
{
ErrorProvider errorProvider1 = new ErrorProvider();
void Validate_Working()
{
errorProvider1.SetError(textbox1, "textbox is empty");
errorProvider1.Clear();
}
}
от
public partial class MainForm
{
Void Validate_NotWorking()
{
ErrorProvider errorProvider1 = new ErrorProvider();
errorProvider1.SetError(textbox1, "textbox is empty");
errorProvider1.Clear();
}
}
Это должно решить вашу проблему, потому что, возможно, вы, возможно, удаляли свои ошибки из другого метода, такого как btnCancel_click. Это сработало для меня:)