Как изменить стиль ячеек таблицы?

Автор Тема: Как изменить стиль ячеек таблицы?  (Прочитано 9222 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Добрый день! Зашел в тупик - не могу изменить стиль ячеек в таблице. При создании таблицы, первая строка имеет стиль Title, вторая Header, а остальные стиль Data. Как присвоить всем ячейкам таблицы стиль Data?


Мой код:
Код - C# [Выбрать]
  1.             Int32 rowsNum = 5;
  2.             Int32 columnsNum = 2;
  3.  
  4.             double rowHeight = 30;
  5.             double columnWidth = 200;
  6.  
  7.             long handle = -1;
  8.  
  9.             var doc = Application.DocumentManager.MdiActiveDocument;
  10.  
  11.             using (Database db = doc.Database)
  12.             {
  13.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  14.                 {
  15.                     using (BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable)
  16.                     {
  17.                         using (BlockTableRecord modelSpace = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord)
  18.                         {
  19.                             using (Table t = new Table())
  20.                             {
  21.                                 t.InsertRows(0, rowHeight, rowsNum);
  22.                                 t.InsertColumns(0, columnWidth, columnsNum);
  23.  
  24.                                 for (int i = 0; i <= rowsNum + 1; i++)
  25.                                     for (int j = 0; j <= columnsNum; j++)
  26.                                     {
  27.                                         t.SetTextString(i, j, i + ":" + j);
  28.                                         t.SetAlignment(i, j, CellAlignment.BottomRight);
  29.                                         //t.SetCellStyle(i, j, "Data"); // НЕ РАБОТАЕТ!
  30.                                     }
  31.  
  32.                                 t.SetRowHeight(rowHeight);
  33.                                 t.SetColumnWidth(columnWidth);
  34.                                 t.Position = new Point3d(100, 100, 0);
  35.  
  36.                                 modelSpace.AppendEntity(t);
  37.  
  38.                                 tr.AddNewlyCreatedDBObject(t, true);
  39.  
  40.                                 handle = t.Handle.Value;
  41.                             }
  42.                         }
  43.                     }
  44.                     tr.Commit();
  45.                 }
  46.             }
  47.  
« Последнее редактирование: 20-02-2019, 11:42:09 от Александр Ривилис »

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Как изменить стиль ячеек таблицы?
« Ответ #1 : 20-02-2019, 11:34:05 »
Возможно тебе поможет эта ссылка
http://bushman-andrey.blogspot.com/2014/06/autocad_5.html

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как изменить стиль ячеек таблицы?
« Ответ #2 : 20-02-2019, 11:41:07 »
Присваивай строкам, а не ячейкам

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как изменить стиль ячеек таблицы?
« Ответ #3 : 20-02-2019, 11:43:55 »
GrandmaSquid3,
Приветствую на форуме!
Прочитай у меня в подписи о правиле форматирования кода на форуме и соблюдай его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Как изменить стиль ячеек таблицы?
« Ответ #4 : 20-02-2019, 11:58:45 »
Присваивай строкам, а не ячейкам

Присвоение стиля строке (t.Rows.Style = "Data") вызывает исключение. Можете запустить мой код у себя? Дело в том, что я сейчас работаю не в AutoCAD, а в его реплике GstarCAD. Хотелось бы знать где ошибка, в моем коде или их API.

Код - C# [Выбрать]
  1.                                 for (int i = 0; i <= rowsNum + 1; i++)
  2.                                 {
  3.                                     t.Rows[i].Style = "Data"; // Ошибка!
  4.                                     for (int j = 0; j <= columnsNum; j++)
  5.                                     {
  6.                                         t.SetTextString(i, j, i + ":" + j);
  7.                                         t.SetAlignment(i, j, CellAlignment.BottomRight);
  8.                                         //t.SetCellStyle(i, j, "Data");
  9.                                     }
  10.                                 }


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как изменить стиль ячеек таблицы?
« Ответ #5 : 20-02-2019, 12:34:48 »
Дело в том, что я сейчас работаю не в AutoCAD, а в его реплике GstarCAD.
На нашем форуме не обсуждается работа с клонами AutoCAD!
« Последнее редактирование: 20-02-2019, 15:16:38 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как изменить стиль ячеек таблицы?
« Ответ #6 : 20-02-2019, 13:07:40 »
Вот так это работает:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. namespace AcadTest
  7. {
  8.     public class TestCellStyle
  9.     {
  10.         [CommandMethod("TestCellStyle")]
  11.         public void RunCommand()
  12.         {
  13.             int rowsNum = 5;
  14.             int columnsNum = 2;
  15.  
  16.             double rowHeight = 30;
  17.             double columnWidth = 200;
  18.  
  19.             long handle = -1;
  20.  
  21.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  22.             Database db = adoc.Database;
  23.  
  24.             using (Transaction tr = db.TransactionManager.StartTransaction())
  25.             {
  26.                 Table table = new Table();
  27.                 table.SetDatabaseDefaults(); // !
  28.                 table.TableStyle = db.Tablestyle; // !
  29.  
  30.                 table.InsertRows(0, rowHeight, rowsNum);
  31.                 table.InsertColumns(0, columnWidth, columnsNum);
  32.  
  33.                 for (int i = 0; i < table.Rows.Count; i++)
  34.                 {
  35.                     for (int j = 0; j < table.Columns.Count; j++)
  36.                     {
  37.                         Cell cell = table.Cells[i, j];
  38.                         cell.TextString = $"{i} : {j}";
  39.                         cell.Alignment = CellAlignment.BottomRight;                        
  40.                     }
  41.                     table.Rows[i].Style = "_DATA"; // "_HEADER" or "_TITLE"
  42.                 }
  43.  
  44.                 table.SetRowHeight(rowHeight);
  45.                 table.SetColumnWidth(columnWidth);
  46.                 table.Position = new Point3d(100, 100, 0);
  47.  
  48.                 BlockTableRecord modelSpace
  49.                     = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
  50.                 modelSpace.AppendEntity(table);
  51.                 tr.AddNewlyCreatedDBObject(table, true);
  52.                 handle = table.Handle.Value;
  53.                 tr.Commit();
  54.             }
  55.         }
  56.     }
  57. }
  58.  

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Как изменить стиль ячеек таблицы?
« Ответ #7 : 20-02-2019, 13:37:56 »
Вот так это работает:

Стоит обратить внимание, что строчка присвоения имени стилей может быть потенциально слабым местом программы.
Код - C# [Выбрать]
  1. table.Rows[i].Style = "_DATA"; // "_HEADER" or "_TITLE"

натыкался на другие названия стилей в примерах
Код - C# [Выбрать]
  1. tb.Rows[a].Style = "Title"; //"Header" or "Data"
http://adn-cis.org/forum/index.php?topic=32

Также в табличном стиле могут быть созданы стили ячеек со своими названиями и применены к таблице.
Предполагаю, что не стоит надеяться на имена стилей  "_DATA" "_HEADER" "_TITLE" в старых, сторонних чертежах и созданных клонами AutoCAD.

Отмечено как Решение GrandmaSquid3 20-02-2019, 14:05:26

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как изменить стиль ячеек таблицы?
« Ответ #8 : 20-02-2019, 13:53:25 »
Тогда так:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.Runtime;
  5. using System.Globalization;
  6. using System.Linq;
  7.  
  8. namespace AcadTest
  9. {
  10.     public class TestCellStyle
  11.     {
  12.         [CommandMethod("TestCellStyle")]
  13.         public void RunCommand()
  14.         {
  15.             int rowsNum = 5;
  16.             int columnsNum = 2;
  17.  
  18.             double rowHeight = 30;
  19.             double columnWidth = 200;
  20.  
  21.             long handle = -1;
  22.  
  23.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  24.             Database db = adoc.Database;
  25.  
  26.             using (Transaction tr = db.TransactionManager.StartTransaction())
  27.             {
  28.                 Table table = new Table();
  29.                 table.SetDatabaseDefaults(); // !
  30.                 table.TableStyle = db.Tablestyle; // !
  31.  
  32.                 TableStyle tableStyle
  33.                     = db.Tablestyle.GetObject(OpenMode.ForRead) as TableStyle;
  34.  
  35.                 string[] cellStyles = tableStyle
  36.                     .CellStyles
  37.                     .Cast<string>()
  38.                     .ToArray();
  39.  
  40.                 string cellStyle = cellStyles
  41.                     .FirstOrDefault(item => item.ToLower
  42.                     (CultureInfo.InvariantCulture).Contains("data"));
  43.  
  44.                 table.InsertRows(0, rowHeight, rowsNum);
  45.                 table.InsertColumns(0, columnWidth, columnsNum);
  46.  
  47.                 for (int i = 0; i < table.Rows.Count; i++)
  48.                 {
  49.                     for (int j = 0; j < table.Columns.Count; j++)
  50.                     {
  51.                         Cell cell = table.Cells[i, j];
  52.                         cell.TextString = $"{i} : {j}";
  53.                         // cell.Alignment = CellAlignment.BottomRight;   // Бесполезное действие т.к. ниже изменяется стиль                  
  54.                     }
  55.                     if (!string.IsNullOrEmpty(cellStyle))
  56.                         table.Rows[i].Style = cellStyle;
  57.                 }
  58.  
  59.                 table.SetRowHeight(rowHeight);
  60.                 table.SetColumnWidth(columnWidth);
  61.                 table.Position = new Point3d(100, 100, 0);
  62.  
  63.                 BlockTableRecord modelSpace
  64.                     = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
  65.                 modelSpace.AppendEntity(table);
  66.                 tr.AddNewlyCreatedDBObject(table, true);
  67.                 handle = table.Handle.Value;
  68.                 tr.Commit();
  69.             }
  70.         }
  71.     }
  72. }
  73.  

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Как изменить стиль ячеек таблицы?
« Ответ #9 : 20-02-2019, 14:10:52 »
Спасибо, все работает!

Итог:
1) В своем коде я ошибся с границами цикла заполнения ячеек.
2) Необходимо задать table.TableStyle = db.Tablestyle , а то никаких изменений стилей не произойдет.
3) Так же добавил table.UnmergeCells(cell) в цикл, а то почему то три колонки объединялись (возможно потому что работаю не в ACAD).