2010-06-11 3 views
1

[.NET 2]управление Списком формы в выпадающем

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

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

Я пробовал:

cboObjectSelection.DataSource = Me.Controls 

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

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

ответ

0

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

0

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

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

Предположим, что если у вас есть панель, которая, в свою очередь, содержит другие элементы управления, вы можете проверить, просто установите условие - проверьте, что Control.Count больше нуля ... вы можете использовать ту же логику рекурсивно. –

0

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

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

Вам нужно рекурсивно перебора всех элементов управления на форме, спускаясь в коллекцию 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

oh ... я забыл упомянуть .NET 2. – serhio

+0

как я могу связать элемент управления с выбранным элементом ComboBox? – serhio

+0

SelectedItem будет экземпляром ControlInfo, который вы можете запустить ((ControlInfo) comboBox1.SelectedItem), чтобы получить его элемент управления. Или CType (comboBox1.SelectedItem, ControlInfo) - это. –

0

Вам придется повторять каждый элемент в контролях и добавьте его в коллекцию Items ComboBox. Простейший код будет выглядеть следующим образом:

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

Вопросы здесь, что Me.Controls является иерархическим. IE, элементы управления внутри панели в вашей форме будут пропущены в этом случае. Вам нужно будет добавить все элементы управления 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 возвращает массив элементов управления, поэтому (0) в конце для получения первого элемента.Здесь вы должны быть в безопасности в отношении исключений за пределы (IE, метод Find не находит ничего), потому что все в ComboBox будет добавлено кодом несколько минут назад.

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

Смежные вопросы