Элементы управления формы списка в Combobox - PullRequest
1 голос
/ 11 июня 2010

[.NET 2]

как мне перечислить элементы управления формы в Combobox той же формы (как это делает VS дизайнер)?

alt text http://lh6.ggpht.com/_1TPOP7DzY1E/TBIDC_uA7NI/AAAAAAAADPM/VAPieyHFzEw/s400/Capture2.gif

Я пытался:

cboObjectSelection.DataSource = Me.Controls

, но это не работает.

Есть ли возможность отфильтровать (настроить) этот список?

Ответы [ 4 ]

0 голосов
/ 11 июня 2010

Вам нужно будет перебрать каждый элемент в коллекции Controls и добавить его в коллекцию ComboBox's Items.Самый простой код выглядел бы так:

For Each c As Control in Me.Controls
    cboObjectSelection.Items.Add(c.Name)
Next

Проблемы здесь в том, что Me.Controls является иерархическим.То есть, элементы управления внутри Panel в вашей форме будут пропущены в этом случае.Вам нужно будет добавить все элементы управления Panel, чтобы получить ВСЕ на форме.Что является идеальным приложением рекурсии:

Private Sub AddControls(ByVal Combo As ComboBox, ByVal Control As Control)
    For Each c As Control In Control.Controls
        Combo.Items.Add(c.Name)
        AddControls(Combo, c)
    Next
End Sub

Чтобы вернуть элемент управления, вы должны сделать следующее:

Dim c As Control = Me.Controls.Find(ComboBox1.SelectedItem.ToString(), True)(0)

Второй параметр сообщает элементу управления find, выполнять ли рекурсию черезиерархия управления.Метод Find возвращает массив элементов управления, следовательно, (0) в конце, чтобы получить первый элемент.Здесь вы должны быть осторожны в отношении исключений за пределами границ (т. Е. Метод Find ничего не находит), потому что все в ComboBox будет добавлено кодом несколько минут назад.

Надеюсь, это поможет!

0 голосов
/ 11 июня 2010

Я поместил код в событие нажатия кнопки, вы можете изменить его в соответствии с вашими требованиями.Надеюсь, это поможет вам.

private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.Controls.Count; i++)
            {
                s = this.Controls[i].GetType().ToString();
                comboBox1.Items.Add(s);

            }

        }
0 голосов
/ 11 июня 2010

Похоже, вы используете VB здесь - и я боюсь, что ответ будет на C #.

Вот мое решение, и вы можете увидеть скриншот (надеюсь, если эта кровавая ссылка сработает!), Где он работает.

image

Вам нужно рекурсивно перебирать все элементы управления в форме, переходя в коллекцию Controls каждого, если у него есть дочерние элементы.

В этом решении используется закрытый класс ControlInfo, внутри которого находится экземпляр Control, который переопределяет операцию ToString (), поэтому вы можете легко настроить текст, отображаемый в комбинированном списке. Затем вы связываете комбо со списком этих данных, создав их из дерева элементов управления формы.

Чтобы использовать этот код, создайте новую форму и поместите туда комбо с именем comboBox1, тогда вы сможете заменить все этим:

public partial class Form1 : Form
{
  private class ControlInfo
  {
    public Control Control { get; set; }
    public override string ToString()
    {
      return string.Format("{0} ({1})", Control.Name, Control.GetType());
    }
  }
  public Form1()
  {
    InitializeComponent();
    comboBox1.DataSource = 
      GetControls(this.Controls.Cast<Control>()).OrderBy(c => c.Name).
        Select(c => new ControlInfo() { Control = c }).ToList();
  }

  private IEnumerable<Control> GetControls(IEnumerable<Control> controls)
  {
    foreach (var control in controls)
    {
      yield return control;
      if (control.Controls.Count > 0)
      {
        foreach (var childControl in GetControls(
          control.Controls.Cast<Control>()))
        {
          yield return childControl;
        }
      }
    }
  }
0 голосов
/ 11 июня 2010

Вы могли бы сделать это, если вы установите ComboBox.DisplayMember на "Name", но тогда вы не получите никаких элементов управления, содержащихся в других элементах управления, поэтому я думаю, что вам придется получать имена всех элементов управления (рекурсивно) и вставьте их в коллекцию, а затем передайте это как DataSource.

...