Элементы формы окна C # Loop - PullRequest
       17

Элементы формы окна C # Loop

1 голос
/ 14 декабря 2011

У меня есть форма окна, в которой есть пара полей со списком. Что мне нужно сделать, так это чтобы в каждом поле со списком, в котором есть элементы, их выбранный индекс был установлен на 0. Вместо того чтобы делать каждое поле со списком по имени вручную, есть функция, которая возвращает все дочерние элементы по типу. Или получить всех детей и сравнить их тип с типом элемента со списком?

@ noah, поначалу ваш оригинальный код не работал, но все, что мне было нужно, это напоминание о том, что дети называются элементами управления (спасибо).

С этим я сделал рекурсивную функцию, которая устанавливает все поля со списком, а не только прямые потомки основной формы:

private void recursiveSetComboBox(Control element)
{
    foreach (Control a in element.Controls)
    {
        if (a.Controls.Count != 0)
            recursiveSetComboBox(a);
        else if (a.GetType().Name == "ComboBox")
        {
            ComboBox b = (ComboBox)a;

            b.SelectedIndex = 0;
        }
    }
}

recursiveSetComboBox(this);

Ответы [ 6 ]

3 голосов
/ 14 декабря 2011

Вот как я бы это сделал:

foreach (var comboBox in myForm.Controls.OfType<ComboBox>())
{
    comboBox.SelectedIndex = 0;
}

Если поля со списком находятся не непосредственно в форме, а внутри контейнера (групповой блок, панель и т. Д.), Используйте это вместо myForm.

2 голосов
/ 14 декабря 2011

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

public void CheckForComboBox(Control crl)
{
foreach (Control crl in this) {

    if (crl is ComboBox && ((ComboBox)crl).Items.Count > 0) {
        ((ComboBox)crl).SelectedIndex = 1;
    } else if (crl.Controls != null && crl.Controls.Count > 0) {
        CheckForComboBox(crl);
    }
}
}
1 голос
/ 01 марта 2013

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

 foreach (Control group in this.Controls)             //Control combo in this.Controls)
            {

                if (group.GetType().Name == "GroupBox")  //(con is ComboBox)
                {
                    foreach (Control con in group.Controls)
                    {
                        if (con.GetType().Name == "ComboBox")
                        {

                            ComboBox combo = (ComboBox)con;
                            _dtStaff=new DataTable();
                              _dtStaff = _staff.getStaffList();
                            combo.DataSource = _dtStaff;
                            combo.DisplayMember = _dtStaff.Columns[1].ToString();
                            combo.ValueMember = _dtStaff.Columns[0].ToString();
                        }
                    }
                }
            }
1 голос
/ 14 декабря 2011

Вы можете перечислить элементы управления и отфильтровать их, используя Linq:

foreach (var comboBox in yourForm.Controls.OfType<ComboBox>())
{
}

Но если у вас есть элементы управления внутри другого элемента управления (например, комбинированные списки внутри панели), вам придется сделать рекурсивную версию.

0 голосов
/ 14 декабря 2011

Вы можете просмотреть элементы управления в своей форме следующим образом:

foreach (Control control in MyForm.Controls) {
     // test control type
}

Обратите внимание, что если вы встраиваете элемент управления (например, помещаете его в панель макета таблицы), то он не найдет ваш элемент управления.

Вместо этого вам нужно рекурсивно вызывать метод, чтобы найти ваши элементы управления, и каждый раз проверять, имеет ли элемент управления, на который вы смотрите , дочерние элементы управления

0 голосов
/ 14 декабря 2011

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

foreach(Control c in MyForm.Controls)
{
//Do something here
}

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

Но нам повезло, у другого поста в Stackoverflow есть решение этой проблемы: Получить доступные элементы управления из формы, используя C #

...