Проблема при переборе пользовательских элементов управления в форме Windows - PullRequest
0 голосов
/ 03 мая 2019

У меня возникла проблема при запуске через все пользовательские элементы управления в моей форме Windows.

Я создаю форму Windows, которая имеет следующие функции:

  1. Основная формаимеет 3 пользовательских элемента управления, встроенные в него
  2. Форма Main также имеет поле со списком.Выбор определенного значения в поле со списком выведет соответствующий пользовательский элемент управления на передний план.
  3. Каждый элемент управления имеет два флажка и два поля со списком.
  4. Пользователь может вызывать каждого пользователяУправляйте через поле со списком основной формы и устанавливайте флажки и / или изменяйте поля со списком внутри каждого пользовательского элемента управления
  5. . После того, как это будет сделано, при нажатии на кнопку будет выполнен следующий код.Предполагается, что этот код проверяет, какие флажки установлены в каждом пользовательском элементе управления, и выполняет некоторые функции:
private void button1_Click(object sender, EventArgs e)
        {
            foreach (Control c in this.Controls)
            {
                if (c is UserControl)
                {
                    foreach (Control ctl in c.Controls)
                    {

                        if (ctl is CheckBox && (ctl as CheckBox).Checked)
                        {
                            Indicator.Text = "It's in";
                        }
                    }
                }
            }
            //Some other code after this
         }

Здесь я включил текстовое поле под названием «Индикатор», которое показывает, является лиКомпилятор ввел определенный цикл for или блок if.И я наблюдаю, что внутреннее «если» само по себе не выполняется.

Может ли кто-нибудь указать, почему именно это происходит?

Ответы [ 3 ]

0 голосов
/ 03 мая 2019

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

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

var u1 = usercontrol1.GetCheckboxStateArray();
var u2 = usercontrol2.GetCheckboxStateArray();

Etc

Или, может быть, вы добавили их программно, и в этом случае имеет смысл отслеживать их в списке по мере их добавления:

protected List<UserControl> _ucList = new List<UserControl>();
...
foreach(var result in somedatabasequery){
  var uc = new UserControl(result.Whatever);
  this.Controls.Add(uc);
  _ucList.Add(uc);
}

Тогда этот список можно повторить. Конечно, вы можете утверждать, что «хорошо. Контроль также является коллекцией, поэтому зачем добавлять их в другой список, когда они уже находятся в доступной коллекции» - по причинам, которые вы здесь; .Controls - это общее описание иерархии всех элементов управления в форме, оно содержит вещи, которые нам не нужны, и их трудно перебирать. Этот список - это просто все, что нас интересует

Кроме того, описанный вами пользовательский интерфейс нетипичен. Более обычным способом скрытия и отображения элементов управления при выделении чего-либо, содержащего немного текста, был бы TabControl. Возможно, вам будет проще проходить циклы, если вы продолжите использовать этот метод «поиска UserControls в наборе элементов управления» - у tabcontrols есть вкладки, у вкладок, вероятно, будет .Controls, который просто содержит ваш UserControl. Закладка по сути заботится о том, чтобы показывать и скрывать элементы управления при нажатии на страницы, что может упростить ваш код

0 голосов
/ 03 мая 2019

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

Таким образом, как @Caius предложил в комментариях, код не функционировал, потому что я не обращался к контейнеру групповых блоков, содержащему эти элементы управления. После того, как я удалил групповые ящики (используемые только в эстетических целях), код начал работать правильно.

0 голосов
/ 03 мая 2019

Вам нужен рекурсивный алгоритм,

void ProcessControls(Control ctrlContainer) 
{ 
    foreach (Control ctrl in ctrlContainer.Controls) 
    { 
        if (ctrl is CheckBox && (ctrl as CheckBox).Checked)
        {
             Indicator.Text = "It's in";
        }
        if (ctrl.HasChildren) 
            ProcessControls(ctrl); 
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...