Игнорировать некоторые элементы управления из метода Form.ValidateChildren () - PullRequest
0 голосов
/ 28 мая 2018

У меня есть форма, которая проверяется на кнопке сохранения методом ValidateChildren.

Id поле также имеет validating и validated, чтобы обеспечить быструю повторную загрузку (различных) документ из базы данных.

Фактическая проблема заключается в том, что при отправке формы: IdText элемент управления не должен получить проверено ввсе, иначе модель будет перезагружена.Решения?

private void IdText_Validating(object sender, CancelEventArgs e)
{
    try
    {
        int n = 0;
        var isNumeric = int.TryParse(IdText.Text, out n);
        if (!isNumeric)
        {
            e.Cancel = true;
            throw new Exception("Valore inserito non valido");
            return;
        }
        dxErrorProvider.SetError(IdText, null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK,
            MessageBoxIcon.Error);

        return;
    }

}

private void IdText_Validated(object sender, EventArgs e)
{
    try
    {
        int n = 0;
        var isNumeric = int.TryParse(IdText.Text, out n);

        if (!isNumeric) throw new Exception("Valore inserito non valido");
        model = Registrazione.Manager.GetRegistrazione(n);

        if (model == null) throw new Exception("Registrazione con id " + n + " non trovata.");
        model.PropertyChanged += OnModelPropertyChanged;
        BindMovimentiEventHandlers(null, null);
        CaricamentoRegistrazione_Load(sender, null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK,
            MessageBoxIcon.Error); return;
    }
}

1 Ответ

0 голосов
/ 28 мая 2018

Я обнаружил, что переопределение ValidateChildren было одним из возможных решений для достижения того, чего я действительно хотел, а затем создание метода для перехвата обработчиков событий Validating каждого элемента управления, однако я знаю об отражении иего ненадежность.Код:

public override bool ValidateChildren()
        {
            bool allValid = true;
            foreach (Control control in this.Controls)
            {
                if (control.Name == "Id")
                {
                    continue;
                }

                if (!control.IsValid())
                {
                    allValid = false;
                }
            }
            return allValid;
        }

public static bool IsValid(this Control controlToValidate)
        {
            Debug.Assert(controlToValidate != null, "Control to validate is null");

            Type t = typeof(Control);


            MethodInfo mi = t.GetMethod("NotifyValidating", BindingFlags.Instance |
                                                            BindingFlags.NonPublic | BindingFlags.InvokeMethod);

            Debug.Assert(mi != null, "Could not get method information.");

            return !((Boolean)mi.Invoke(controlToValidate, null));

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...