Как включить ВСЕ элементы управления в форме? - PullRequest
6 голосов
/ 25 августа 2011

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

Я использовал привязки, но я не думаю, что они являются хорошим решением.Во-первых, это ненужная сложность.Во-вторых, вы не можете использовать привязки для всего.Например, у элементов MenuStrip их свойство Enabled не может быть связано со свойством fileLoaded.Только все меню может, и я не хочу отключать все меню при запуске, только определенные операции с меню, которые работают с файлом.

Я просто ищу способ включить ВСЕ.Большинство, когда их спросят, ответят следующим образом:

foreach (Control c in Controls)
{
    c.Enabled = true;
}

Однако это не работает для включения элементов или элементов управления MenuStrip в других элементах управления (таких как Panel или пользовательский элемент управления).Поэтому он не включит полосы прокрутки внутри контейнеров.

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

Ответы [ 5 ]

12 голосов
/ 25 августа 2011

Рекурсия

private void enableControls(Control.ControlCollection Controls)
{
    foreach (Control c in Controls)
    {
        c.Enabled = true;
        if (c is MenuStrip)
        {
           foreach(var item in ((MenuStrip)c).Items)
           { 
              item.Enabled = true;
           }
        }
        if (c.ControlCollection.Count > 0)
            enableControls(c.Controls);

    }
}

Редактировать

Должно быть проверено количество контрольных коллекций вместо HasControls, то есть Webcontrols

6 голосов
/ 25 августа 2011

Поместите все элементы управления в панель;

panel.enable = false -> все элементы управления на панели будут отключены panel.enable = true -> все элементы управления на панели будут включены (если они включены по умолчанию, в ближайшее время заполните панель включенными элементами управления, отключите панель, чтобы ее элементы тоже были отключены. После включения панели ваш управление будет включено)

3 голосов
/ 13 октября 2011

Для элементов меню можно сделать это рекурсивно, это очень просто.Просто установите флаг item.Enabled в true или false.

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

namespace Test_MenuItemIteration
{
    using System.Collections.Generic;
    using System.Windows.Forms;

    public static class GetAllMenuStripItems
    {
        #region Methods

        /// <summary>
        /// Gets a list of all ToolStripMenuItems
        /// </summary>
        /// <param name="menuStrip">The menu strip control</param>
        /// <returns>List of all ToolStripMenuItems</returns>
        public static List<ToolStripMenuItem> GetItems(MenuStrip menuStrip)
        {
            List<ToolStripMenuItem> myItems = new List<ToolStripMenuItem>();
            foreach (ToolStripMenuItem i in menuStrip.Items)
            {
                GetMenuItems(i, myItems);
            }
            return myItems;
        }

        /// <summary>
        /// Gets the menu items.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="items">The items.</param>
        private static void GetMenuItems(ToolStripMenuItem item, List<ToolStripMenuItem> items)
        {
            items.Add(item);
            foreach (ToolStripItem i in item.DropDownItems)
            {
                if (i is ToolStripMenuItem)
                {
                    GetMenuItems((ToolStripMenuItem)i, items);
                }
            }
        }

        #endregion Methods
    }
}

Используйте в своем приложении:

List<ToolStripMenuItem> myItems = GetAllMenuStripItems.GetItems(this.menuStrip1);
foreach (var item in myItems)
{
    MessageBox.Show(item.Text);
    item.Enabled = false;
}
2 голосов
/ 25 августа 2011

Сделайте это:

var Enable = (Control c) =>
             {
                 c.Enabled = true;
                 if(c.Controls != null)
                     foreach(Control c2 in c.Controls)
                         Enable(c2);
             }

Enable(YourForm);
1 голос
/ 25 августа 2011

Рекурсивная итерация по вашему меню необходима, чтобы отключить все пункты в ваших меню.Однако существует более простое решение для всех ваших элементов управления формой - вставьте их в панель, которая охватывает всю форму, и отключите форму в VS Designer.Когда ваш пользователь выберет файл, включите Panel и альт!Никакой дополнительной рекурсии (или накладных расходов) не требуется.

Если вы все еще хотите пойти по рекурсивному маршруту, я бы изменил метод Enable, сначала переименовав его в ChangeEnabledState, а во-вторых, я бы выбрал параметр bool, который быпозволяют использовать для присвоения Enabled свойство.Таким образом, вы можете включить / отключить элементы управления по мере необходимости.Помните, однако, что вам нужно будет добавить проверку, чтобы увидеть, пропущен ли элемент управления (или какой-либо другой элемент управления, который вы используете для открытия OpenFileDialog) в операции отключения.

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