|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionIn this article, I will show you how to perform a recursive controls iteration to get all the controls inside a form. BackgroundEvery form has a collection of controls inside it. This collection can be accessed through private void GetControls(Control.ControlCollection a_oControlCollection)
{
foreach(Control t_oBaseControl in a_oControlCollection)
{
}
This code works fine only if we don't have nested controls, which happens when we use containers, menus and toolbars. So, in this case, we have to iterate through each container to retrieve its controls. But, how can we know if the current control is a common control, a container, a menu or a toolbar? The best way I found is to use a switch(t_oBaseControl.GetType().Name)
{
}
Now, we have all the control's types and we have to create a case "Button":
case "CheckBox":
case "CheckedListBox":
case "ComboBox":
case "DateTimePicker":
case "Label":
case "LinkLabel":
case "ListBox":
case "ListView":
case "MaskedTextBox":
case "MonthCalendar":
case "NumericUpDown":
case "PictureBox":
case "ProgressBar":
case "RadioButton":
case "RichTextBox":
case "TextBox":
case "WebBrowser":
cbbControls.Items.Add(t_oBaseControl.Name);
break;
For the case "FlowLayoutPanel":
case "GroupBox":
case "Panel":
case "TableLayoutPanel":
cbbControls.Items.Add(t_oBaseControl.Name);
GetControls(t_oBaseControl.Controls);
break;
For the case "SplitContainer":
cbbControls.Items.Add(t_oBaseControl.Name);
GetControls(((SplitContainer)t_oBaseControl).Panel1.Controls);
GetControls(((SplitContainer)t_oBaseControl).Panel2.Controls);
break;
And the same for the case "TabControl":
cbbControls.Items.Add(t_oBaseControl.Name);
foreach(TabPage t_oTabPage in ((TabControl)t_oBaseControl).TabPages)
{
cbbControls.Items.Add(t_oTabPage.Name);
GetControls(t_oTabPage.Controls);
}
break;
For the *Strip components, things become annoying. For the case "MenuStrip":
cbbControls.Items.Add(t_oBaseControl.Name);
foreach(ToolStripMenuItem t_oMenuItem in ((ToolStrip)t_oBaseControl).Items)
{
cbbControls.Items.Add(t_oMenuItem.Name);
GetMenuItems(t_oMenuItem.DropDownItems);
}
break;
For the case "StatusStrip":
case "ToolStrip":
cbbControls.Items.Add(t_oBaseControl.Name);
for(int i = 0;i < ((ToolStrip)t_oBaseControl).Items.Count;i++)
{
switch(((ToolStrip)t_oBaseControl).Items[i].GetType().Name)
{
case "ToolStripButton":
case "ToolStripComboBox":
case "ToolStripLabel":
case "ToolStripMenuItem":
case "ToolStripProgressBar":
case "ToolStripStatusLabel":
case "ToolStripTextBox":
ToolStripItem t_oToolStripItem =
(ToolStripItem)((ToolStrip)t_oBaseControl).Items[i];
cbbControls.Items.Add(t_oToolStripItem.Name);
break;
case "ToolStripSplitButton":
ToolStripSplitButton t_oToolStripSplitButton =
(ToolStripSplitButton)((ToolStrip)t_oBaseControl).Items[i];
cbbControls.Items.Add(t_oToolStripSplitButton.Name);
GetMenuItems(t_oToolStripSplitButton.DropDownItems);
break;
case "ToolStripDropDownButton":
ToolStripDropDownButton t_oToolStripDropDownButton =
(ToolStripDropDownButton)((ToolStrip)t_oBaseControl).Items[i];
cbbControls.Items.Add(t_oToolStripDropDownButton.Name);
GetMenuItems(t_oToolStripDropDownButton.DropDownItems);
break;
}
}
break;
Just for example, we can also iterate through all nodes inside a case "TreeView":
cbbControls.Items.Add(t_oBaseControl.Name);
foreach(TreeNode t_oTreeNode in ((TreeView)t_oBaseControl).Nodes)
{
cbbControls.Items.Add(t_oTreeNode.Name);
GetNodes(t_oTreeNode.Nodes);
}
break;
Below are those two necessary methods mentioned earlier: private void GetMenuItems(ToolStripItemCollection a_oToolStripItemCollection)
{
foreach(ToolStripItem t_oToolStripItem in a_oToolStripItemCollection)
{
cbbControls.Items.Add(t_oToolStripItem.Name);
switch(t_oToolStripItem.GetType().Name)
{
case "ToolStripMenuItem":
GetMenuItems(((ToolStripMenuItem)t_oToolStripItem).DropDownItems);
break;
}
}
}
private void GetNodes(TreeNodeCollection a_oTreeNodeCollection)
{
foreach(TreeNode t_oTreeNode in a_oTreeNodeCollection)
{
cbbControls.Items.Add(t_oTreeNode.Name);
GetNodes(t_oTreeNode.Nodes);
}
}
Using the CodeTo use this code, simply call History
Copyright © 2007 Sergio A. B. Petrovcic. All rights reserved. Do not publish to other sites without my express permission. Link to this article in accordance with this site's policies and procedures.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||