2012-04-11 4 views
0

У меня есть приложение WinForms и несколько форм и вы хотите использовать компонент ErrorProvider на каждом из них. EDIT:, чтобы проверить, правильно ли введен пользовательский ввод (например, если введенный номер находится в диапазоне и т. Д.). Мне кажется бесполезным чтобы удалить этот компонент в каждую форму. Что делать, если я делаю один глобальный объект (или как его называть) и использовать его для каждой формы?Глобальные объекты или нет?

Моя идея:

namespace MyApplication { 
static class Program { 

public static ErrorProvider EP = new ErrorProvider(); 
... 

И тогда в этой индивидуальной форме для обработки Validating и Validated события:

private void txtBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) { 
    if (txtBox1.Text != "correct text") { 
    e.Cancel = true; 
    Program.EP.SetError(txtBox1, "You have error in your input"); 
... 

Является ли это правильный подход, или я должен сделать это как-то еще?

И если мне нужно больше глобальных объектов, может быть, я должен поместить их всех вместе в какой-то отдельный статический класс и в Program создать именно этот (?)
Спасибо.

+0

Для чего вы собираетесь использовать 'ErrorProvider'? Будет ли это состояние? – Oded

+0

Вопрос отредактирован ... – Enriqe

ответ

0

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

Я ж у вас есть очень разные валидаций создать 2 классов, например: NumericTextBox и StringTextBox

1

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

1

Это нормально, чтобы иметь глобальный объект, но я предпочел бы сделать это статический класс без гражданства, если это возможно. Безгражданство обеспечит легкую безопасность потоков. Для .NET обычно существует глобальные (в пространстве имен) статические классы, например FileInfo или Convert.

Если вам нужны только несколько глобальных методов, и они работают с элементами пользовательского интерфейса, вы также можете написать некоторые методы расширения для System.Windows.Controls.Control или даже System.Windows.Controls.TextBox, если это единственный элемент управления, который вы хотите. Это даст вам немного лучше код:

txtBox1.Validate("correct text", "You have error in your input"); 

метод расширения может выглядеть следующим образом:

public static class MyExtension 
{ 
    public static void Validate(this TextBox myTextBox, string correctText, string error) 
    { 
     if(myTextBox.Text != correctText) 
      Console.WriteLine(string.Format("{0} [{1} == '{2}']", error, myTextBox.Name, myTextBox.Text)); 
    } 
} 

Который даст вам это сообщение в консоли:

You have error in your input [txtBox1 == 'some text']

Look по методам расширения documentation, если вам нужна дополнительная информация.

+0

Супер, спасибо! – Enriqe

+1

@ Enriqe, вы всегда можете изменить то, что вы выбрали, как лучший ответ на свой вопрос :-) –

+0

: D Да, вы правы.Мне нравится идея написания расширений какого-то базового компонента, я знаю, что вы его тоже написали, но @Ali Issa был первым, во всяком случае, спасибо за то, что я настроил :) Приятного дня и ... извините;) – Enriqe

Смежные вопросы