Получить все элементы управления текущей формы во время разработки - PullRequest
1 голос
/ 23 апреля 2011

У меня есть вопрос о вещах времени разработки:

Я создал компонент со свойством "Ссылки".Эти ссылки являются элементами управления.Теперь я хочу создать UI-диалог (для редактирования этого свойства в сетке свойств).

Как получить все элементы управления текущей формы?Я думаю, что компонент имеет отношение к нему, но где?Я ничего не могу найти.

Спасибо:)

Ответы [ 4 ]

2 голосов
/ 23 апреля 2011

Чтобы получить все элементы управления текущей формы, используйте следующий код, чтобы получить коллекцию всех элементов управления в этой форме:

MyForm.Controls

См. Эту справку MSDN

Edit:

Возможно, это поможет?

Поддержка редактора во время разработки для коллекции элементов управления

http://social.msdn.microsoft.com/Forums/en-US/winformsdesigner/thread/64df27e7-8502-42ac-8634-cf8a8937d922/

Добавление поддержки времени разработки для вложенного контейнера в custom / usercontrol (Winforms)

1 голос
/ 23 апреля 2011

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

Для этого есть лучшая мышеловка, например, она используется компонентами HelpProvider и ErrorProvider. Обратите внимание, как они добавляют свойства ко всем другим элементам управления в форме. Это делается путем реализации интерфейса IExtenderProvider. Прекрасный пример тому есть в статье библиотеки MSDN .

0 голосов
/ 18 января 2019

Вы можете получить услугу IDesignerHost во время разработки.Эта служба имеет свойство под названием Container, которое имеет Components.Затем для каждого компонента получите сервис INestedContainer, а затем получите все компоненты этого сервиса.

Так работает окно Document Outline .Я изменил их метод, чтобы использовать List<IComponent> в качестве возвращаемого значения:

List<IComponent> GetSelectableComponents(IDesignerHost host)
{
    var components = host.Container.Components;
    var list = new List<IComponent>();
    foreach (IComponent c in components)
        list.Add(c);
    for (var i = 0; i < list.Count; ++i)
    {
        var component1 = list[i];
        if (component1.Site != null)
        {
            var service = (INestedContainer)component1.Site.GetService(
                typeof(INestedContainer));
            if (service != null && service.Components.Count > 0)
            {
                foreach (IComponent component2 in service.Components)
                {
                    if (!list.Contains(component2))
                        list.Add(component2);
                }
            }
        }
    }
    return list;
}

Чтобы отфильтровать результат, содержащий только элементы управления, вы можете вызвать result.TypeOf<Control>().

0 голосов
/ 01 января 2014

Не уверен, что это именно то, что вам нужно.

Я "потерял" элемент управления меткой, случайно удалив его текстовое свойство.

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

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