Работа с WindowForms.

Автор Тема: Работа с WindowForms.  (Прочитано 9611 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Работа с WindowForms.
« : 05-12-2022, 12:07:19 »
Добрый день!
Прошу помочь с кодом?
Создал класс в Visual Studio SortLevels, который фильтрует виды уровней.

public class SortLevels : IExternalCommand
    {
       
        public bool IsTemplate { get; private set; }

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
           
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;

            Document doc = uiDoc.Document;

            FilteredElementCollector collector = new FilteredElementCollector(doc);
            ICollection<Element> levels = collector.OfCategory(BuiltInCategory.OST_Views).Where(x => !(x as Autodesk.Revit.DB.View).IsTemplate
            && (x as Autodesk.Revit.DB.View).ViewType != ViewType.Elevation
            && (x as Autodesk.Revit.DB.View).ViewType != ViewType.ThreeD
            && (x as Autodesk.Revit.DB.View).ViewType != ViewType.Section).ToList();

Мне нужно вывести класс в форму, в виде checkedListBox1.





Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #1 : 05-12-2022, 16:36:39 »
А у CheckedListBox есть свойство "ItemsSource"? Если да, то попросту задать нечто типа
Код - C# [Выбрать]
  1. checkedListBox1.ItemsSource = levels;
Не сработает?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Re: Работа с WindowForms.
« Ответ #2 : 05-12-2022, 16:57:50 »
Нет такого метода.

Вот, как ответили коллеги иностранцы.



Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #3 : 05-12-2022, 17:42:09 »
Они в своем репертуаре. Ну даже если будет создан такой класс для представления - что от этого поменяется. если не удается связать элемент формы с коллекцией?
А так да, создавать "временные" классы для отчетов иногда приходится, тут не спорю.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #4 : 06-12-2022, 10:06:38 »
Единственное, что пришло в голову - это последовательно вводить элементы в checkedListBox, попутно устанавливая свойство Checked. Но это, конечно, решение так себе. Может, есть и альтернативные варианты - но я в WinForms чуть меньше чем ноль
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Re: Работа с WindowForms.
« Ответ #5 : 06-12-2022, 11:26:58 »
У меня есть коллектор с определенными видами уровней и в каждой модели они свои. Я же не могу привязываться к имени? Мне этот список можно как-то создать и перечислить по Id и Name уровни? Как можно это написать?


Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #6 : 06-12-2022, 11:51:01 »
Можно попытаться поменять прямую реализацию LevelRepository на некий абстрактный GenericReository или вообще интерфейс, и в каждом конкретном случае подсовывать свою реализацию. Я не шарю в Revit и его API, так что более подробно уже точно не скажу.
Off-Topic: показать
Я у себя в коде примерно так и сделал - отдельный интерфейс, и пара его реализаций - одна для реальной работы с файлами dwg, вторая для тестов и обработки фейковых данных.

А что значит "в каждой модели они свои"? Общие-то свойства какие-то есть, верно? И потом, я сделал элементарнейший вариант. Барин, дай пару часов, с работой подразобраться надо :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #7 : 06-12-2022, 12:02:43 »
Так, пока слегка отпустило. Допустим, что Level у тебя становится нечто типа:
Код - C# [Выбрать]
  1. namespace WindowsFormsApp1.Entities
  2. {
  3.     public class Level
  4.     {
  5.         public int Id { get; set; }
  6.         public string Name { get; set; }
  7.         public string BaseRevitFileName { get; set; }
  8.         public bool IsTemplate { get; set; }
  9.     }
  10. }
И вместо Name тебе надо показывать и BaseRevitFileName, и собственно Name (уж откуда и как ты будешь это выцеплять - проблема того самого LevelRepository ;)).
Тогда есть два варианта:
Добавлять "напрямую, в лоб и без протокола":
Код - C# [Выбрать]
  1.             foreach (Level item in levels)
  2.             {
  3.                 checkedListBox1.Items.Add(item.BaseRevitFileName + " => "+ item.Name);
  4.                 checkedListBox1.SetItemChecked(pos, item.IsTemplate);
  5.  
  6.                 pos++;
  7.             }
Либо ради приколу переопределить ToString для Level:
Код - C# [Выбрать]
  1. namespace WindowsFormsApp1.Entities
  2. {
  3.     public class Level
  4.     {
  5.         public int Id { get; set; }
  6.         public string Name { get; set; }
  7.         public string BaseRevitFileName { get; set; }
  8.         public bool IsTemplate { get; set; }
  9.  
  10.         public override string ToString()
  11.         {
  12.             return $"{BaseRevitFileName} >> {Name}";
  13.         }
  14.     }
  15. }
  16.  
И тогда вставка становится попроще:
Код - C# [Выбрать]
  1.             foreach (Level item in levels)
  2.             {
  3.                 checkedListBox1.Items.Add(item);
  4.                 checkedListBox1.SetItemChecked(pos, item.IsTemplate);
  5.                 pos++;
  6.             }
Учитывая далеко ненулевую вероятность, что аналогичное представление понадобится еще в тысяче разных мест, я б, наверно, пошел по второму пути
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Re: Работа с WindowForms.
« Ответ #8 : 06-12-2022, 13:37:23 »
Алексей, спасибо, что уделил время! Молниеносно реагируешь. А в сообществе писал, что только переходишь на C#(всем бы так). ;) ;D
Мне это нужно попробавать...

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #9 : 06-12-2022, 14:13:57 »
Off-Topic: показать
Дык я и не перешел еще. Мне до перехода как до Луны и обратно. Пешком :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Re: Работа с WindowForms.
« Ответ #10 : 28-12-2022, 15:14:37 »
Подчеркивает Levels и pos.
Levels и pos не существует в таком контексте

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #11 : 28-12-2022, 15:23:55 »
Ну что поделаешь, значит, не существуют. А что, где и как ты хочешь сделать?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Re: Работа с WindowForms.
« Ответ #12 : 28-12-2022, 15:32:00 »
Я хочу уровни видов(отсортированные и собранные в классе) вывести в форму Form через checkedListBox1

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Re: Работа с WindowForms.
« Ответ #13 : 28-12-2022, 15:50:53 »
Ну тогда смотри, где и в каком виде у тебя определяются Levels и pos. Судя по тому, что видно на картинке - это вообще обработчик клика на элементе CheckedList. Чисто теоретически это событие вообще ни сном ни духом про Levels и что с ними делать, естественно, не понимает. Так-то, наверное, надо sender превратить в Level, найти его в Levels и поменять для этого элемента IsTemplate?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Re: Работа с WindowForms.
« Ответ #14 : 28-12-2022, 16:08:37 »
А как sender превратить в Level?