2013-12-02 3 views
0

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

public string Name 
{ 
    get { return name; } 

    set 
    { 
     if (! RegEx.IsMatch(value, "\w{1-35}")) 
      throw new Exception("Name must be 1-35 alfanum"); 
     this.name = value; 
    } 
} 

Когда я связываю это свойство к "Text" свойству TextBox управления в приложении WinForm, то введенное пользователем значение будет проверяться с помощью этого правила, поэтому как я могу поймать это исключение и показать его с помощью объекта ErrorProvider?

ответ

1

При добавлении привязки к вашему контролю, подписаться на это Parse события (происходит, когда значение изменяется управление с привязкой к данным):

textBox1.DataBindings.Add("Text", person, "Name"); 
textBox1.DataBindings["Text"].Parse += Binding_Parse; 

Затем в обработчике события сделайте следующее:

void Binding_Parse(object sender, ConvertEventArgs e) 
{ 
    var binding = (Binding)sender; 
    try 
    { 
     binding.Parse -= Binding_Parse; // remove this event handler 
     binding.WriteValue(); // try write control's value to data source 
     errorProvider1.SetError(binding.Control, ""); 
    } 
    catch (Exception error) 
    { 
     errorProvider1.SetError(binding.Control, error.Message); 
    } 
    finally 
    { 
     binding.Parse += Binding_Parse; // subscribe back 
    } 
} 

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

Вы можете повторно использовать тот же обработчик событий для всех привязок данных у вас есть:

foreach (Control control in Controls) 
    foreach (Binding binding in control.DataBindings) 
     binding.Parse += Binding_Parse; 
+0

Где я должен поставить последние коды? – Masoud

+0

@Masoud после установки привязок ваших элементов управления. Например. в конструкторе формы или в 'Form_Load' –

+0

Я использовал ваши коды в своем приложении, но свойство Set метода Name запускается после завершения Binding_Parse, и, следовательно, errorprovider не показывает никаких ошибок. WriteValues ​​() не вызывает свойство Set Name! – Masoud

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