2014-10-13 5 views
1

Предположим, у меня есть 10 текстовых полей, и все они имеют разные значения, но все они - текстовые поля. И у меня есть метод CheckInputValue(Textbox tb). Теперь, щелкнув по кнопке, я хотел бы, чтобы метод проверял все текстовые поля и определял, разрешено ли это значение.Существует ли эффективный способ вызова одного и того же метода для всех объектов типа T?

Но я не хочу, чтобы это сделать:

 void DoWork() 
    { 
     CheckInputValue(t1); 
     CheckInputValue(t2); 
     CheckInputValue(t3); 
     CheckInputValue(t4); 
     ... 
     CheckInputValue(tx); 

    } 

ОБРАТИТЕ ВНИМАНИЕ: выше только в качестве примера.

У меня есть сложный метод, который необходимо выполнить на нескольких элементах управления одного типа, и у меня есть около 25 элементов управления. Есть ли более элегантный способ сделать это? Спасибо.

+0

Я думаю, что вы не должны проверять данные внутри управления. Вы должны проверить данные, которые в вашей модели просмотра. В этом случае вы можете добавить атрибут (например, [Validate]) к свойствам вашей модели просмотра, и когда вам понадобится, вы сможете собрать все свойства, которые имеют этот атрибут, и проверить значения. –

+0

Трудно ли создать набор всех элементов управления, которые вы хотите оценить? Казалось бы, это тяжелая часть. –

+0

Являются ли элементы управления в некоторой коллекции, реализующей 'IEnumerable '? – Jodrell

ответ

0

Вы можете сделать это:

List<TextBox> tbxList = new List<TextBox>() 
{ 
    t1, 
    t2, 
    t3, 
    t4 
}; 

foreach (Textbox tbx in tbxList) 
{ 
    CheckInputValue(tbx); 
} 
+0

Извините, если я слишком требовательна, но есть еще более элегантный способ добавления элементов управления в список, например i ++, потому что все мои элементы управления называются i1, i2, i3 .... ix: S –

+0

Или мне придется вручную писать их, как i1, i2 .... ix? P.S Есть много таких элементов управления! –

+0

(edit for another answer) –

1

Если у Вас есть все t «S в списке, вы можете использовать List<T>.ForEach:

listWithT.ForEach(CheckInputValue); 

или петли над ними с регулярным foreach:

foreach (T t in list) 
{ 
    CheckInputValue(t); 
} 

Или создать встроенный массив:

foreach (T t in new T[] { t1, t2, t3 }) 
{ 
    CheckInputValue(t); 
} 

Если нет, то нет простого способа сделать так.

+2

откровенно , если бы у вас их было в списке, вы могли бы просто «foreach» - это было бы проще и эффективнее; p Но это сработало –

+0

@MarcGravell: Edited. –

+0

Мне нравится идея создания встроенного массива с использованием foreach :) Но так как у меня есть большой контроль, нужно ли вручную указывать имена элементов управления? Я спрашиваю об этом, потому что все мои элементы управления имеют соответствующие имена, такие как i1, i2, i3 ... ix –

0

Извините, если я быть аа немного слишком требовательным, но есть еще более элегантный способ добавления элементов управления в списке что-то вроде я ++ , потому что все мои управления названы i1, i2, i3 .... IX: S

Вы можете сделать это (но это грязная):

int n_tbx = 5; 
List<TextBox> tbxList = new List<TextBox>(); 

for (int i = 0; i < n_tbx; i++) 
{ 
    //Where "this" is your mainframe 
    tbxList.Add(this.Controls.Find("t"+i, true).FirstOrDefault() as TextBox); 
} 

foreach (Textbox tbx in tbxList) 
{ 
    CheckInputValue(tbx); 
} 
+0

Да, вы правы. Думаю, мне лучше добавить их вручную в список. и я не думаю, что вы можете использовать 'this.Controls' в приложении Windows Phone. –

0

Думаю, у меня есть идея о том, как вы можете сделать это немного проще и более MVVM. Это упрощено - нет изменений в изменении свойств, набрав атрибут и прочее. Просто для вас идея. Итак, основная идея заключается в том, что вы можете пометить все свойства, которые должны быть проверены с помощью какого-либо атрибута (в этом случае ValidateAttribute), и используя единственный метод Validate, вы можете собрать все свойства и проверить его в одном месте.

class SampleViewModel 
{ 
    [Validate] 
    public string SomeProperty { get; set; } 

    [Validate] 
    public string AnotherProperty { get; set; } 

    public void Validate() 
    { 
     foreach (var propertyInfo in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.IsDefined(typeof(ValidateAttribute), true))) 
     { 
      var value = propertyInfo.GetValue(this, null); 
      Validate(value as string); 
     } 
    } 

    private void Validate(string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      // do something with the invalid input, i.e. throw the exception 
     } 
    } 
} 

class ValidateAttribute : Attribute 
{ 
} 
0

Я хочу построить на предыдущем ответе, и пусть у вас есть код сделать работу за вас, так что вы можете вызвать один метод и получить результаты, которые вы хотите:

Вы можете наследовать от текстового поля и добавить в некоторых функциональных возможностях, которые будут иметь все он характеристики текстового поля, но и добавит себя в один список, который отслеживает все этот объект:

public class CustomTextBox :TextBox 
{ 
    private static List<CustomTextBox> CustomTextBoxList = new List<CustomTextBox>(); 

    public static async void ValidateAll() 
    { 
     foreach (CustomTextBox MyCustomTextBox in CustomTextBoxList) 
     { 
      ****PERFORM VALIDATION**** 
     } 
    } 

    public CustomTextBox() 
    { 
     CustomTextBoxList.Add(this); 
    } 

    ~CustomTextBox() 
    { 
     CustomTextBoxList.Remove(this); 
    } 
} 

Это очень легко добавить их к вашей странице XAML (извините, я не уверен, как поставить XAML в этот ответ):

Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
    StackPanel 
    local:CustomTextBox Text="A" Width="150" Margin="10"/ 
    local:CustomTextBox Text="B" Width="150" Margin="10"/ 
    local:CustomTextBox Text="C" Width="150" Margin="10"/ 
    local:CustomTextBox Text="D" Width="150" Margin="10"/ 
    local:CustomTextBox Text="E" Width="150" Margin="10"/ 
    Button Content="Validate TextBoxes!" Click="Button_Click"/ 
    /StackPanel 
/Grid 

При нажатии на кнопку, она вызывает одну функцию, которая будет выполнять проверку на всех из них в то же время:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    CustomTextBox.ValidateAll(); 
} 
Смежные вопросы