如何循环所有控件(包括ToolStripItems)C#

时间:2010-12-22 04:55:18

标签: c# controls

我需要保存并恢复表单上特定控件的设置。

我遍历所有控件并返回名称与我想要的名称匹配的控件,如下所示:

private static Control GetControlByName(string name, Control.ControlCollection Controls)
{
  Control thisControl = null;
  foreach (Control c in Controls)
  {
    if (c.Name == name)
    {
      thisControl = c;
      break;
    }
    if (c.Controls.Count > 0)
    {
        thisControl = GetControlByName(name, c.Controls);
      if (thisControl != null)
      {
        break;
      }
    }
  }
  return thisControl;
}

由此我可以确定控制的类型,从而确定应该存储的属性。

除非控件是已添加到工具条的ToolStrip系列之一,否则这种方法很有效。 e.g。

this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.lblUsername,  // ToolStripLabel 
        this.toolStripSeparator1,
        this.cbxCompany}); // ToolStripComboBox 

在这种情况下,我可以在调试时看到我对(cbxCompany)感兴趣的控件,但是name属性没有值,因此代码与它不匹配。

关于我如何获得这些控件的任何建议?

干杯, 默里

2 个答案:

答案 0 :(得分:3)

感谢您的帮助。

Pinichi让我走上正轨,我正在检查toolStrip.Controls - 应该是toolStrip.Items

以下代码现在对我来说非常合适:

private static Control GetControlByName(string controlName, Control.ControlCollection parent)
{
  Control c = null;
  foreach (Control ctrl in parent)
  {
    if (ctrl.Name.Equals(controlName))
    {
      c = ctrl;
      return c;
    }

    if (ctrl.GetType() == typeof(ToolStrip))
    {
      foreach (ToolStripItem item in ((ToolStrip)ctrl).Items)
      {
        if (item.Name.Equals(controlName))
        {
          switch (item.GetType().Name)
          {
            case "ToolStripComboBox":
              c = ((ToolStripComboBox)item).Control;
              break;
            case "ToolStripTextBox":
              c = ((ToolStripTextBox)item).Control;
              break;
          }
          if (c != null)
          {
            break;
          }
        }
      }
    }
    if (c == null)
      c = GetControlByName(controlName, ctrl.Controls);
    else
      break;
  }
  return c;
}

答案 1 :(得分:0)

试试这个:

//for toolstrip
            if (ctrl is ToolStrip)
            {
                ToolStrip ts = ctrl as ToolStrip;
                foreach (ToolStripItem it in ts.Items)
                {
                    if (it is ToolStrienter code herepSeparator)
                    {
                        //-------------------------
                    }
                    else
                    {
                        //do something
                    }

                }
            }//---------------