foreach (Ctrl управления в Frm.Controls), в каком порядке он берет управление - PullRequest
2 голосов
/ 24 декабря 2010

У меня есть особая проблема с порядком, в котором элементы управления TextBox добавляются в свойство Controls формы.

В настоящее время у меня есть функция:

 public static bool IsValidate(System.Windows.Forms.Form Frm)
 {
     foreach (Control ctrl in Frm.Controls)                  
         if (ctrl is TextBox)
         //  if (((TextBox)ctrl).AccessibleDescription == "Valid" && ((TextBox)ctrl).Text == string.Empty)
         if (((TextBox)ctrl).AccessibleDescription == "Valid" &&  ((TextBox)ctrl).Text.Trim()== "")
         {
             MessageBox.Show(((TextBox)ctrl).AccessibleName + " Can't be Blank", Program.companyName, MessageBoxButtons.OK, MessageBoxIcon.Stop);                         
             ((TextBox)ctrl).Focus();
              return false;
         }
         return true;
}

Но это повторяетсячерез текстовые поля случайным образом, хотя я установил их табуляционные индексы.

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

Я хочу знать, есть ли какое-либо свойство элементов управления, которое позволило бы мне управлять их потоком.

Ответы [ 7 ]

15 голосов
/ 15 сентября 2012

Вы можете сделать это легко.Пожалуйста, используйте следующий синтаксис и какие элементы сортировки в соответствии с вашим tabindex в вашей форме

foreach (Control control in this.Controls.Cast<Control>()
                                         .OrderBy(c => c.TabIndex))
{
}
4 голосов
/ 24 декабря 2010

Гораздо проще отсортировать элементы управления вручную, чем управлять их порядком в коллекции Controls.Пример (сортируется по TabOrder):

    private static int CompareTabIndex(TextBox c1, TextBox c2)
    {
        return c1.TabIndex.CompareTo(c2.TabIndex);
    }

    public static bool IsValid(Form form)
    {
        List<TextBox> textBoxes = new List<TextBox>();
        foreach(Control ctl in form.Controls)
        {
            TextBox textBox = ctl as TextBox;
            if(textBox != null) textBoxes.Add(textBox);
        }
        textBoxes.Sort(new Comparison<TextBox>(CompareTabIndex));
        foreach(TextBox textBox in textBoxes)
        {
            if(textBox.AccessibleDescription == "Valid" && textBox.Text.Trim() == "")
            {
                MessageBox.Show(textBox.AccessibleName + " Can't be Blank",
                    Program.companyName, MessageBoxButtons.OK, MessageBoxIcon.Stop);
                textBox.Focus();
                return false;
            }
        }
        return true;
    }
3 голосов
/ 24 декабря 2010

Это действительно перебирает элементы управления "случайно"?(Подразумевается, что он недетерминирован и порядок, вероятно, будет меняться каждый раз.) Или каждый раз он перебирает элементы управления в одном и том же порядке, но не тот порядок, который вы ожидаете?Я подозреваю, что это последнее, учитывая, что спецификация языка C # явно устанавливает порядок foreach (см. Первый ответ).

Порядок табуляции определенно не повлияет на порядокуправления.Это только для целей пользовательского интерфейса.Фактический порядок элементов управления в качестве элементов массива в резервном хранилище, скорее всего, определяется порядком, в котором они были созданы при построении формы.

Можете ли вы подробнее остановиться на той последней части, где вы снова разрабатываете форму"и взять текстовое поле последовательно"?

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

Элементы управления располагаются в порядке Z-порядка элементов управления в том же родительском контейнере (сверху вниз и снизу вверх).Чтобы проверить, попробуйте разместить элементы управления на форме и получить заказ.Примените «Send to Back» или «Bring to Front» для нескольких элементов управления (во время разработки или во время выполнения).Порядок foreach будет меняться в зависимости от самого верхнего элемента управления вначале и вниз.

Сгенерированный код Designer добавляет элементы управления на основе z-порядка.Сначала самый низкий контроль (последний самый верхний контроль).Следовательно, похоже, что он основан на порядке, в котором он добавлен в контейнер.

Я не уверен, что реализация BringToFront () и SendToBack () внутренне удаляет и добавляет элементы управления в требуемом порядке,Для меня имеет смысл иметь его на основе z-порядка.И, как уже упоминалось выше, мы всегда можем использовать наш собственный порядок, если требуется.

1 голос
/ 06 сентября 2012

У меня была эта проблема, и я изменил имя элемента управления заказами в Designer.cs,

this.groupBox3.Controls.Add(this.txtPrice);
this.groupBox3.Controls.Add(this.txtDate);
0 голосов
/ 02 декабря 2016

См. Схема документа формы в представлении -> Другие окна -> Схема документа. А затем измените иерархию элементов управления, как вам нужно. foreach смотрит туда

0 голосов
/ 21 января 2011

Можно визуально перетащить элементы управления в форму в конструкторе, а затем открыть исходный файл Form.Designer.cs и найти место, где дизайнер ввел код, чтобы добавить элементы управления в коллекцию элементов управления (т.е. Добавить строки) и переупорядочить эти строки в * .Designer.cs вручную. Как только вы это сделаете, дизайнер должен оставить ваши изменения в покое. Я заметил, что дизайнер пишет их в обратном порядке. Ваш foreach должен найти их в том порядке, в котором вы их организовали.

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