2009-11-16 2 views
4

Я ищу способ прокрутки элементов управления на определенной вкладке tabcontrol. Например, у меня есть TabControl со следующими вкладками:Loop через элементы управления в TabControl

Автомобилей, Домашних животных, Администратор

На каждом из этих вкладок несколько элементов управления для отображения/редактирование/сохранения данных и т.д. На «Сохранить» , я хотел бы пропустить элементы управления для этой конкретной вкладки, чтобы проверить, были ли заполнены все обязательные поля.

Итак, если я нахожусь на вкладке «Автомобили» и нажимаю «Сохранить», я хочу, чтобы цикл был ТОЛЬКО через элементы управления на вкладке «Автомобили», а не «Домашние» или вкладки «Администратор».

Как достичь этого результата?

ответ

9

Что касается циклических элементов управления TabControl, вам необходимо использовать свойство Controls.

Вот MSDN article на TabControl.

Пример:

 TabPage page = aTabControl.SelectedTab; 

     var controls = page.Controls; 

     foreach (var control in controls) 
     { 
      //do stuff 
     } 
2

Пример, где я хотел получить DataGridView на определенной вкладке для приложения, которое я написал.

TabPage pg = tabControl1.SelectedTab; 

// Get all the controls here 
Control.ControlCollection col = pg.Controls; 

// should have only one dgv 
foreach (Control myControl in col) 
{ 
    if (myControl.ToString() == "System.Windows.Forms.DataGridView") 
    { 
     DataGridView tempdgv = (DataGridView)myControl; 
     tempdgv.SelectAll(); 
    } 
} 
+1

Почему так сложно? Кроме того, вы можете сделать «if (myControl - DataGridView)» –

+0

Как этот комплекс? Он имеет несколько вкладок и мне нужен конкретный элемент управления на вкладке (например, DGV). – 2009-11-16 19:58:36

+0

Возможно, сложным было неправильное слово. Почему у вас есть pg и col? Они не используются повторно ... –

0

TabControl имеет свойство SelectedTab, так что вы могли бы сделать что-то вроде этого:

foreach(Control c in tabControl.SelectedTab.Controls) 
{ 
    //do checks 
} 
0
foreach (Control c in this.tabControl1.SelectedTab.Controls) 
{ 
    // Do something 
} 
1

Свойство Controls является путь ...

foreach(Control c in currentTab.Controls) 
{ 
    if(c is TextBox) 
     // check for text change 
    if(c is CheckBox) 
     //check for check change 
    etc... 
} 
8

Я чувствую, что это важно отметить, что в целом вы должны использовать более структурированный подход к своей заявке. Например, вместо того, чтобы иметь все элементы управления на трех вкладках, включите ровно один UserControl на каждую вкладку. A CarUserControl, PetUserControl и AdminUserControl, например. Затем каждый пользовательский элемент управления знает, как создать соответствующую соответствующую структуру данных, поэтому вам не нужно вручную объединять все вместе на одном уровне абстракции, используя петли между вкладками и многое другое.

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

+1

Да, хороший совет и лучший ответ. –

+0

Я ответил ответом Джозефа как ответ, но дал вам +1 за ценный совет. Благодаря! – Sesame

+0

Мы используем этот подход, используя пользовательский UserControl, который является контейнером, который может быть загружен щелчком кнопки, встроенной в контейнер, в свое отдельное окно, когда это удобно для пользователя. Это могут быть и сторонние элементы управления. – PaulR

0

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

private void toggleControls(Control control, bool state) 
    { 
     foreach (Control c in control.Controls) 
     { 
      c.Enabled = state; 
      if (c is Control) 
      { 
       toggleControls(c, state); 
      } 
     } 
    } 
Смежные вопросы