Как найти панель объект

Где найти в “Свойства” строку “Объект”?

Виктор Пахмутов



Ученик

(97),
на голосовании



8 лет назад

Для этого в свойствах ярлыка в строке «Объект» нужно добавить параметр…. и т. д. Не могу найти эту самую строку в свойствах. Подскажите

Голосование за лучший ответ

Петро .

Профи

(816)


8 лет назад

Не совсем понятно, что имеется в виду. Строка “Объект” находится во вкладке “Ярлык” в свойствах ярлыка. В некоторых случаях, если программа зарегистрирована в системе, эта строка может быть не активна. В этом случае, найдите программу в “Program Files” и пересоздайте ярлык программы. Тогда строка будет активна и в неё можно будет добавлять параметры.

I have a task to generate a XML file of the layout, but I seem to have a problem recognizing Panel controls on the form. To recognize the objects, I use something like this:

foreach (Control c in this.Controls) {
    if (c is Button) {
        //generate XML...
    } else if (c is Panel) {
        //generate XML...
    }
}

It finds all the controls just fine, but not the Panel objects.
Can anyone tell me what am I doing wrong here? Is panel not a Control?

Jared Harley's user avatar

Jared Harley

8,1594 gold badges39 silver badges48 bronze badges

asked Dec 4, 2012 at 20:50

Kajzer's user avatar

6

A panel is a Control, but you only get the Controls which are directly in the Form, not the ones that are inside other Controls.

So how about something like this:

void DoRecursive(Control ctrl)
{
    foreach (Control subCtrl in ctrl.Controls) DoRecursive(subCtrl);

    if (ctrl is Button) etc.
}

Or perhaps your //generate XML... as a Button exits the foreach. Perhaps it has a break.

answered Dec 4, 2012 at 21:46

ispiro's user avatar

ispiroispiro

26.3k38 gold badges133 silver badges280 bronze badges

You can use this recursive function .

var panels = FindControls<Panel>(aForm).ToList();

IEnumerable<T> FindControls<T>(Control ctrl) where T: Control
{
    foreach (Control c in ctrl.Controls)
    {
        if (c.GetType() == typeof(T)) yield return (T)c;
        foreach (var subC in FindControls<T>(c))
            yield return subC;
     }
}

answered Dec 4, 2012 at 21:19

L.B's user avatar

L.BL.B

114k19 gold badges177 silver badges224 bronze badges

I tried your code with a simple form having one button and one panel on the form and one button inside the panel. It worked for me finding the first button and the panel.
Maybe the problem is you want to access the controls whose parent is the panel?

answered Dec 4, 2012 at 21:02

Daniel Fuchs's user avatar

3

Your code should work. Try modifying the code to not do an else if and see if you can locate the Panel:

foreach (Control c in this.Controls) {
    if (c is Panel) {
        MessageBox.Show("Hey, I found the " + c.Name + " panel!");
    }
}

We could also try locating it by name and seeing what type of a control it is:

foreach (Control c in this.Controls) {
    // Looks for a control called 'panel1' - put in your panel's name
    if (c.Name == "panel1") {
        MessageBox.Show("Hey, I found a " + c.GetType().ToString());
    }
}

answered Dec 4, 2012 at 20:57

Jared Harley's user avatar

Jared HarleyJared Harley

8,1594 gold badges39 silver badges48 bronze badges

4

У меня есть задача создать XML-файл макета, но у меня, похоже, проблема с распознаванием элементов управления Panel в форме. Чтобы распознать объекты, я использую что-то вроде этого:

foreach (Control c in this.Controls) {
    if (c is Button) {
        //generate XML...
    } else if (c is Panel) {
        //generate XML...
    }
}

Он находит все элементы управления просто отлично, но не объекты Panel. Может кто-нибудь сказать мне, что я здесь делаю не так? Разве панель не является элементом управления?

2012-12-04 20:50

4
ответа

Решение

Панель это элемент управления, но вы получаете только те элементы управления, которые находятся непосредственно в форме, а не те, которые находятся внутри других элементов управления.

Так как насчет этого:

void DoRecursive(Control ctrl)
{
    foreach (Control subCtrl in ctrl.Controls) DoRecursive(subCtrl);

    if (ctrl is Button) etc.
}

Или, возможно, ваш //generate XML... как кнопка выходит из foreach, Возможно, у него есть break,

2012-12-04 21:46

Вы можете использовать эту рекурсивную функцию.

var panels = FindControls<Panel>(aForm).ToList();

IEnumerable<T> FindControls<T>(Control ctrl) where T: Control
{
    foreach (Control c in ctrl.Controls)
    {
        if (c.GetType() == typeof(T)) yield return (T)c;
        foreach (var subC in FindControls<T>(c))
            yield return subC;
     }
}

2012-12-04 21:19

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

2012-12-04 21:02

Ваш код должен работать. Попробуйте изменить код, чтобы не делать else if и посмотрим, сможете ли вы найти панель:

foreach (Control c in this.Controls) {
    if (c is Panel) {
        MessageBox.Show("Hey, I found the " + c.Name + " panel!");
    }
}

Мы также можем попробовать найти его по имени и посмотреть, какой это тип элемента управления:

foreach (Control c in this.Controls) {
    // Looks for a control called 'panel1' - put in your panel's name
    if (c.Name == "panel1") {
        MessageBox.Show("Hey, I found a " + c.GetType().ToString());
    }
}


user42471

04 дек ’12 в 20:57
2012-12-04 20:57

2012-12-04 20:57

Другие вопросы по тегам
c#
.net

В группе инструментов AutoCAD Architecture 2021 выберите «Разрешить общим параметрам объектной привязки действовать на линии привязки стены». Выберите инструмент стены. На существующем сегменте стены щелкните объектную привязку на линии привязки, от которой вы хотите начать новый сегмент стены.

Штриховка или заливка объектов или областей

  1. Выберите вкладку «Главная» панель «Рисование» «Штриховка». …
  2. В списке «Тип штриховки» панели «Свойства» выберите тип штриховки, который вы хотите использовать.
  3. На панели «Шаблон» щелкните образец штриховки или заливки.
  4. На панели «Границы» укажите способ выбора границы узора: …
  5. Щелкните область или объект, который необходимо заштриховать.

Включить панели инструментов

  1. В командной строке введите МЕНЮПАР и установите значение 1.
  2. Щелкните меню Инструменты > Панели инструментов.
  3. Выберите нужные панели инструментов, чтобы включить их.

Где находится панель построения в AutoCAD 2020?

Панель «Сборка» должна отображаться на вкладке ленты «Главная» по умолчанию в следующих рабочих пространствах AutoCAD Architecture: AutoCAD Architecture (британская система мер США) AutoCAD Architecture (метрическая система США) AutoCAD Architecture (глобальная)

Как открыть дверь в AutoCAD?

Создание двери

  1. Выберите инструмент двери на палитре инструментов. …
  2. На чертеже выберите стену или оконно-дверную сборку, в которую нужно вставить дверь, или нажмите Enter, чтобы добавить отдельно стоящую дверь.
  3. Укажите точку вставки для двери. …
  4. Выберите обоснование.
  5. Продолжайте добавлять двери и нажмите Enter.

Как штриховать стену в AutoCAD?

Задание штриховки для компонентов стены

  1. Выберите стену, которую вы хотите изменить, щелкните правой кнопкой мыши и выберите «Редактировать отображение объекта». …
  2. Перейдите на вкладку «Свойства экрана».
  3. Выберите экранное представление, в котором должны отображаться изменения, и выберите «Переопределение объекта». …
  4. При необходимости нажмите .
  5. Перейдите на вкладку «Штриховка».

Как заполнить объект в AutoCAD?

Как штриховать или закрашивать объекты/области?

  1. Перейдите на панель «Рисование» на вкладке «Главная». …
  2. Вы увидите вкладку «Создание штриховки». …
  3. Далее укажите узор на панели Pattern.
  4. Выберите нужный метод: «Указать точки» или «Выбрать граничные объекты». …
  5. После заполнения области нажмите «Enter», чтобы применить штриховку.

Как нарисовать стену в AutoCAD 2016?

В разделе AutoCAD Architecture выберите Разрешить общим параметрам объектной привязки действовать на линии привязки стены. Выберите инструмент стены. На существующем сегменте стены щелкните объектную привязку на линии привязки, от которой вы хотите начать новый сегмент стены. Укажите конечную точку нового сегмента стены.

Инструменты Автокад

  • Линия.
  • Круг.
  • Прямоугольник.
  • Полилиния.
  • Обрезка.
  • Продлевать.
  • Копировать.
  • Зеркало.

Включите панели инструментов с помощью меню:

  1. В командной строке введите МЕНЮБАР и установите значение 1.
  2. Щелкните меню Сервис > Панели инструментов и выберите нужную(ые) панель(и) инструментов.

На панели инструментов «Свойства объекта» отображается информация о текущем слое. На приведенном выше рисунке вы можете видеть, что слой «0» является текущим слоем, а цвет и тип линии установлены «По слою». Когда вы начинаете новый чертеж, AutoCAD имеет только один слой.

Как отобразить вкладки в AutoCAD?

Откройте окно «Параметры», введя ОПЦИИ в командной строке или нажав кнопку «Параметры» в меню приложения AutoCAD в левом верхнем углу, щелкните вкладку «Отображение», а затем в разделе «Элементы макета» установите флажок «Отображать вкладки «Макет» и «Модель». а затем нажмите кнопку ОК.

Как отобразить вкладки чертежа в AutoCAD?

Решение. В командной строке AutoCAD используйте команду FILETAB, чтобы включить вкладки файлов, и команду FILETABCLOSE, чтобы отключить их. Имейте также в виду, что CTRL-TAB будет циклически перемещаться по вашим открытым чертежам.

Как отобразить панель ленты в AutoCAD?

В командной строке AutoCAD введите:

  1. ЛЕНТА, чтобы показать/включить ленту.
  2. RIBBONCLOSE, чтобы скрыть/отключить ленту.

У меня есть задача создать XML-файл макета, но, похоже, у меня проблема с распознаванием элементов управления Panel в форме. Чтобы распознать объекты, я использую что-то вроде этого:

foreach (Control c in this.Controls) {
    if (c is Button) {
        //generate XML...
    } else if (c is Panel) {
        //generate XML...
    }
}

Он прекрасно находит все элементы управления, но не объекты Panel. Может ли кто-нибудь сказать мне, что я здесь делаю не так? Панель – это не элемент управления?

4 ответа

Лучший ответ

Панель является элементом управления, но вы получаете только элементы управления, которые находятся непосредственно в форме, а не те, которые находятся внутри других элементов управления.

Итак, как насчет этого:

void DoRecursive(Control ctrl)
{
    foreach (Control subCtrl in ctrl.Controls) DoRecursive(subCtrl);

    if (ctrl is Button) etc.
}

Или, возможно, ваш //generate XML... как кнопка выходит из foreach. Возможно, у него есть break.


1

ispiro
5 Дек 2012 в 01:52

Ваш код должен работать. Попробуйте изменить код, чтобы не выполнять else if, и посмотрите, сможете ли вы найти Panel:

foreach (Control c in this.Controls) {
    if (c is Panel) {
        MessageBox.Show("Hey, I found the " + c.Name + " panel!");
    }
}

Мы также можем попробовать найти его по имени и посмотреть, какой это тип элемента управления:

foreach (Control c in this.Controls) {
    // Looks for a control called 'panel1' - put in your panel's name
    if (c.Name == "panel1") {
        MessageBox.Show("Hey, I found a " + c.GetType().ToString());
    }
}


-1

Jared Harley
5 Дек 2012 в 01:13

Вы можете использовать эту рекурсивную функцию.

var panels = FindControls<Panel>(aForm).ToList();

IEnumerable<T> FindControls<T>(Control ctrl) where T: Control
{
    foreach (Control c in ctrl.Controls)
    {
        if (c.GetType() == typeof(T)) yield return (T)c;
        foreach (var subC in FindControls<T>(c))
            yield return subC;
     }
}

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


0

Daniel Fuchs
5 Дек 2012 в 01:02

Добавить комментарий