2016-08-05 8 views
1

У меня есть форма, содержащая TabControl и ErrorProvider. На одной из вкладок есть несколько текстовых полей и кнопка. Текстовые поля используют событие Validating для SetError(), если содержимое недействительно. Когда кнопка нажата, это работает:C# Errorprovider.ContainerControl.Controls содержит только TabControl

bool ok = true; 
foreach (Control c in errorProviderDv.ContainerControl.Controls) 
{ 
    MessageBox.Show(c.Name); 
    if (errorProviderDv.GetError(c) != "") 
    { 
     ok = false; 
    } 
} 

TabControl является единственным элементом управления в errorProviderDv.ContainerControl.Controls, даже несмотря на несколько ошибок устанавливаются и отображение в форме.

Я что-то не так? Должен ли ErrorProvider быть дочерним элементом вкладки вместо формы?

+1

Вы не можете назначить 'TabControl' или' TabPage' как 'ContainerControl' или' ErrorProvider'. Каково ваше требование? Вы хотите узнать состояние проверки всей «Формы» или только той конкретной вкладки TabPontrol? –

+0

Я просто смотрю на одну TabPage за раз. У меня есть другой ErrorProvider для каждой вкладки. –

+1

Вам не нужно использовать несколько компонентов ErrorProvider. Одного из них достаточно для всей формы. В любом случае вы можете изменить foreach, чтобы посмотреть в '(Control c в Control c в tabControl1.TabPages [0] .Controls)', если вы хотите проверить эти элементы управления. –

ответ

0

Сам элемент TabControl представляет собой контейнер, содержащий вкладки. Эти вкладки представляют собой контейнеры, которые содержат ваши текстовые поля.

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

private void button1_Click(object sender, EventArgs e) 
    { 
    bool ok = true; 
    foreach (Control c in errorProviderDv.ContainerControl.Controls) 
    { 
     if (c is TabControl) 
     { 
      foreach (Control t in (c as TabControl).SelectedTab.Controls) 
      { 
       MessageBox.Show(t.Name); 
       if (errorProviderDv.GetError(t) != "") 
       { 
        ok = false; 
       } 
      } 
     } 
    } 
} 
Смежные вопросы