Как я могу пройти через все элементы управления (включая ToolStripItems) C # - PullRequest
3 голосов
/ 22 декабря 2010

Мне нужно сохранить и восстановить настройки для определенных элементов управления в форме.

Я перебираю все элементы управления и возвращаю тот, чье имя совпадает с тем, которое я хочу, вот так:

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, которое было добавлено в toolstrip. например, * +1008 *

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

В этом случае при отладке я вижу интересующий меня элемент управления (cbxCompany), но свойство name не имеет значения, поэтому код не соответствует ему.

Любые предложения о том, как я могу получить к этим элементам управления тоже?

Ура, Мюррей

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Спасибо за вашу помощь, ребята.

Пиничи поставил меня на правильный путь, я проверял 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;
}
0 голосов
/ 24 февраля 2015

Попробуйте это:

//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
                    }

                }
            }//---------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...