Выгрузка данных из dataGridView в таблицу Автокада

Автор Тема: Выгрузка данных из dataGridView в таблицу Автокада  (Прочитано 4615 раз)

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

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Добрый день! Наверняка кто-то занимался вопросом создания таблицы в автокад на основе данных из dataGridView диалога WinForms. Буду признателен если кто-то поделится опытом. Задачу хочу "повесить" на кнопку в диалоге. Вот код, который "грузит" данные в dataCridView из открытого чертежа.
Код - C# [Выбрать]
  1. [private void button_zag_Click(object sender, EventArgs e)
  2.         {
  3.             // Получение активного чертежа AutoCAD
  4.             blockAttributes = new List<BlockAttribute>();
  5.  
  6.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  7.             Database acCurDb = acDoc.Database;
  8.             Editor acEd = acDoc.Editor;
  9.  
  10.             // Запрос пользователю для выбора блоков с атрибутами
  11.             PromptSelectionResult res = acEd.GetSelection(new SelectionFilter(new[]
  12.             { new TypedValue((int)DxfCode.Start, "INSERT"),
  13.                 //new TypedValue((int)DxfCode.Operator, "<OR"), // Добавляем оператор OR
  14.                 //new TypedValue((int)DxfCode.LayerName, "HATCH"), // Условие для штриховки
  15.                 //new TypedValue((int)DxfCode.Operator, "<OR"), // Добавляем оператор OR
  16.                 //new TypedValue((int)DxfCode.LayerName, "MPOLYGON"), // Условие для штриховки
  17.                 //new TypedValue((int)DxfCode.Operator, "OR>"), // Закрываем оператор OR
  18.             }));
  19.  
  20.             if (res.Status == PromptStatus.OK)
  21.             {
  22.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  23.                 {
  24.                     SelectionSet acSSet = res.Value;
  25.  
  26.                     foreach (ObjectId objectId in acSSet.GetObjectIds())
  27.                     {
  28.                         BlockReference blockReference = acTrans.GetObject(objectId, OpenMode.ForRead) as BlockReference;
  29.  
  30.                         if (blockReference.AttributeCollection.Count > 0)
  31.                         {
  32.                             BlockAttribute blockAttribute = new BlockAttribute();
  33.  
  34.                             foreach (ObjectId attId in blockReference.AttributeCollection)
  35.                             {
  36.                                 AttributeReference attributeReference = acTrans.GetObject(attId, OpenMode.ForRead) as AttributeReference;
  37.  
  38.                                 blockAttribute.Attributes.Add(attributeReference.Tag, attributeReference.TextString);
  39.                             }
  40.  
  41.                             blockAttributes.Add(blockAttribute);
  42.                         }
  43.                     }
  44.  
  45.                     acTrans.Commit();
  46.                 }
  47.             }
  48.  
  49.             // Группируем блоки по значениям атрибутов
  50.             var groupedAttributes = blockAttributes.GroupBy(a => string.Join(", ", a.Attributes.Values));
  51.  
  52.             // Создаем DataTable для отображения в dataGridView
  53.             System.Data.DataTable dataTable = new System.Data.DataTable();
  54.  
  55.             foreach (var attribute in blockAttributes.First().Attributes)
  56.             {
  57.                 dataTable.Columns.Add(attribute.Key);
  58.             }
  59.  
  60.             dataTable.Columns.Add("Количество");
  61.  
  62.             foreach (var group in groupedAttributes)
  63.             {
  64.                 DataRow dataRow = dataTable.NewRow();
  65.  
  66.                 foreach (var attribute in group.First().Attributes)
  67.                 {
  68.                     dataRow[attribute.Key] = attribute.Value;
  69.                 }
  70.  
  71.                 dataRow["Количество"] = group.Count();
  72.  
  73.                 dataTable.Rows.Add(dataRow);
  74.             }
  75.  
  76.             // Настраиваем dataGridView
  77.             dataGridView.DataSource = dataTable;
  78.            
  79.             this.Show();
  80.             //Commands commands = new Commands();
  81.             //commands.RunForm1Dialog();
  82.         }
  83.         //Функция словаря для блоков
  84.         public class BlockAttribute
  85.         {
  86.             public Dictionary<string, string> Attributes { get; set; }
  87.  
  88.             public BlockAttribute()
  89.             {
  90.                 Attributes = new Dictionary<string, string>();
  91.             }
  92.         }
  93.  

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Не делай так
Создай класс для хранения данных из блока и в DataSource кидай список этих объектов

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Не делай так
Создай класс для хранения данных из блока и в DataSource кидай список этих объектов

Мне показалось проще в классе диалога всё заполнить в dataGridView и потом создать автокадовскую таблицу тоже по нажатию кнопки.
Ну а если как вариант создать отдельный класс, то как из него в определенном порядке закидывать в datagrigview? Можешь какой-нибудь пример показать?

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Не делай так
Создай класс для хранения данных из блока и в DataSource кидай список этих объектов


Мне показалось проще в классе диалога всё заполнить в dataGridView и потом создать автокадовскую таблицу тоже по нажатию кнопки.
Ну а если как вариант создать отдельный класс, то как из него в определенном порядке закидывать в datagrigview? Можешь какой-нибудь пример показать?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
var List<Class1> list = new();
dataGridView.DataSourc = list;

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
У меня конечная цель - сделать автокадовскую таблицу - Спецификацию в чертеже. Предлагаешь делать её уже в Class1 ?


Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
задача на один метод

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Что-то не так получилось. Решил создать экземпляр класса. При построении выдает ошибку именно в экземпляре этого класса
error CS0305: Для использования универсального тип "System.Collections.Generic.List<T>" требуется 1 аргументов типа

Код - C# [Выбрать]
  1.             // Создаем экземпляр класса CreateTable для хранения данных из блоков
  2.             CreateTable createTable = new CreateTable();            
  3.             createTable.Data = new List();
  4.             foreach (var group in groupedAttributes)
  5.             {
  6.                 TableRow row = new TableRow();
  7.  
  8.                 foreach (var attribute in group.First().Attributes)
  9.                 {
  10.                     row.Cells.Add(new TableCell(attribute.Key, attribute.Value));
  11.                 }
  12.  
  13.                 row.Cells.Add(new TableCell("Количество", group.Count())); createTable.Data.Add(row);
  14.             }
  15.  
  16.             // Установка DataSource для dataGridView
  17.             dataGridView.DataSource = createTable.Data; this.Show();
  18.         }
  19.  
  20.         // Класс для хранения данных из блоков
  21.         public class BlockAttribute
  22.         {
  23.             public Dictionary Attributes
  24.             {
  25.                 get; set;
  26.             }
  27.  
  28.             public BlockAttribute()
  29.             {
  30.                 Attributes = new Dictionary();
  31.             }
  32.         }
  33.  
  34.         // Класс для хранения данных для вывода на dataGridView
  35.         public class CreateTable
  36.         {
  37.             public List Data { get; set; }
  38.         }
  39.         public class TableRow
  40.         {
  41.             public List Cells { get; set; }
  42.  
  43.             public TableRow() { Cells = new List(); }
  44.         }
  45.  
  46.  
  47.  
  48.         // Класс для хранения данных ячейки таблицы
  49.         public class TableCell
  50.         {
  51.             public string Key { get; set; }
  52.             public object Value { get; set; }
  53.  
  54.         public TableCell(string key, object value)
  55.         {
  56.             Key = key; Value = value; }
  57.         }
« Последнее редактирование: 13-11-2023, 15:48:13 от Александр Ривилис »

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Всё не так
У тебя же известны поля - так сделай класс с этими полями