Как установить валидацию для всех элементов управления в пользовательском элементе управления? - PullRequest
2 голосов
/ 23 ноября 2010

Я ищу лучший способ установить группу проверки для всех элементов управления, содержащихся в пользовательском элементе управления.Большинство элементов управления в элементе управления создаются динамически при загрузке элемента управления.У него довольно много полей ввода и валидаторов.

Я бы хотел сэкономить время, установив валидацию для всех элементов управления и валидаторов с помощью какой-то функции, которая могла бы просто проходить через все и устанавливать.

Кажется, однако, что нет единого интерфейса, включающего группу проверки для всех различных элементов управления, которые имеют свойство.

Должен ли я использовать отражение для проверки группы проверки, я знаю, что могу это сделать, но есть ли лучший способ?

Кстати, мы используем C #.

Любая помощь будет оценена.Спасибо!

РЕДАКТИРОВАТЬ: Я положил ответ ниже для тех, кто хочет код.

Ответы [ 3 ]

1 голос
/ 18 января 2011

Просто хотел отметить этот ответ.

Вот код, который я использовал для установки группы проверки. Я решил использовать рефлексию, так как я мог проверять типы для тех, кого я знаю, имеющих ValidationGroup, а также приводить и устанавливать, но есть много типов для проверки, и он может пропустить новые элементы управления, которые могут быть добавлены в будущем. Было бы здорово, если бы ValidationGroup были частью какого-то интерфейса, который должны были быть реализованы.

/// <summary>
/// this is an extension method to iterate though all controls in a control collection
/// put this in some static library somewhere
/// </summary>
/// <param name="controls"></param>
/// <returns></returns>
public static IEnumerable<Control> All(this ControlCollection controls)
{
    foreach (Control control in controls)
    {
        foreach (Control grandChild in control.Controls.All())
            yield return grandChild;

        yield return control;
    }
}


/// <summary>
/// this function uses reflection to check if the validation group exists, and then set it to the 
/// specified string
/// </summary>
/// <param name="ValidationGroup"></param>
private void SetValidationGroup(string ValidationGroup)
{
    //set the validation group for all controls
    if (ValidationGroup.IsNotNullOrEmpty())
    {
        foreach (Control c in Controls.All())
        {
            var Properties = c.GetType().GetProperties();
            var vg = Properties.Where(p => p.Name == "ValidationGroup").SingleOrDefault();
            if (vg != null)
            {
                vg.SetValue(c, ValidationGroup, null);
            }

        }

    }
}
1 голос
/ 23 ноября 2010

У меня недавно была очень похожая проблема - решение, которое я использовал, заключалось в создании пары методов расширения, которые могли бы перебрать все дочерние / дочерние элементы управления элемента управления, найти элементы определенного типа и затем вызвать для них подпрограмму ( эта подпрограмма может, например, установить любые свойства элемента управления). Код ниже в VB.Net (извините, это то, что мы используем на работе, я уверен, что переводчик кода должен иметь возможность разобраться с этим для вас).

Public Module ControlExtensionMethods

''' <summary>
''' Gets all validation controls used by a control.
''' </summary>
''' <param name="onlyGetVisible">If true, will only fetch validation controls that currently apply (i.e. that are visible). The default value is true.</param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()>
Public Function GetAllValidationControls(ByVal target As Control, Optional ByVal onlyGetVisible As Boolean = True) As ReadOnlyCollection(Of BaseValidator)
    Dim validators As New List(Of BaseValidator)
    GetControlsOfType(Of BaseValidator)(target, Function(x) Not onlyGetVisible OrElse x.Visible = onlyGetVisible, validators)
    Return validators.AsReadOnly()
End Function

''' <summary>
''' Gets if the control is in a valid state (if all child/descendent validation controls return valid)
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
<Extension()>
Public Function IsValid(ByVal target As Control) As Boolean
    Return target.GetAllValidationControls().All(Function(x)
                                                     x.Validate()
                                                     Return x.IsValid
                                                 End Function)
End Function

''' <summary>
''' Iteratively fetches all controls of a specified type/base type from a control and its descendents.
''' </summary>
''' <param name="fromControl"></param>
''' <param name="predicate">If provided, will only return controls that match the provided predicate</param>
''' <remarks></remarks>
<Extension()>
Public Function GetControlsOfType(Of T As Control)(ByVal fromControl As Control, Optional ByVal predicate As Predicate(Of T) = Nothing) As IList(Of T)
    Dim results As New List(Of T)
    GetControlsOfType(fromControl, predicate, results)
    Return results
End Function

Private Sub GetControlsOfType(Of T As Control)(ByVal fromControl As Control, ByVal predicate As Predicate(Of T), ByVal results As IList(Of T))
    'create default predicate that always returns true if none is provided
    Dim cntrl As Control

    If predicate Is Nothing Then predicate = Function(x) True

    If fromControl.HasControls Then
        For Each cntrl In fromControl.Controls
            GetControlsOfType(Of T)(cntrl, predicate, results)
        Next
    End If

    If TypeOf fromControl Is T AndAlso predicate(fromControl) Then
        results.Add(fromControl)
    End If
End Sub
End Module

Пример использования этого кода для отключения всех валидаторов:

Array.ForEach(myUserControl.GetAllValidationControls().ToArray(), sub(x) x.Enabled = False)
0 голосов
/ 19 декабря 2013

Я только сейчас пытался решить эту проблему и придумал альтернативное решение, не включающее утку:

string newGroup = "foo";
IEnumerable<BaseValidator> validators = this.Controls.OfType<BaseValidator>();
IEnumerable<Button> buttons = this.Controls.OfType<Button>();

foreach (var validator in validators)
    validator.ValidationGroup = newGroup;

foreach (var button in buttons)
    button.ValidationGroup = newGroup;

Это также может быть альтернативой:

foreach (var c in this.Controls)
{
    if (c is BaseValidator)
        (c as BaseValidator).ValidationGroup = newGroup;
    else if (c is Button)
        (c as Button).ValidationGroup = newGroup;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...