У меня есть несколько таблиц TableLayoutPanels, каждая из которых отображает категорию информации имя / значение в двух столбцах - один с информационными метками, а другой с метками данных.
В каждом из них я установил первый столбец для автоматического изменения размера и выровнял по правому краю все метки, что прекрасно работает. Однако он работает отдельно для каждой TableLayoutPanel (очевидно) и выглядит примерно так:
TableLayoutPanel 1:
+--------+--------+
| Name 1 | Data 1 |
+--------+--------+
| Name 2 | Data 2 |
+--------+--------+
| Name 3 | Data 3 |
+--------+--------+
TableLayoutPanel 2:
+------------------+--------+
| Long Name 1 | Data 1 |
+------------------+--------+
| Very Long Name 2 | Data 2 |
+------------------+--------+
| Long Name 3 | Data 3 |
+------------------+--------+
Я ищу способ учитывать все меток имен при автонастройке всех первых столбцов, поэтому это выглядит так:
TableLayoutPanel 1:
+------------------+--------+
| Name 1 | Data 1 |
+------------------+--------+
| Name 2 | Data 2 |
+------------------+--------+
| Name 3 | Data 3 |
+------------------+--------+
TableLayoutPanel 2:
+------------------+--------+
| Long Name 1 | Data 1 |
+------------------+--------+
| Very Long Name 2 | Data 2 |
+------------------+--------+
| Long Name 3 | Data 3 |
+------------------+--------+
Я не могу поместить все данные в одну таблицу, потому что каждая таблица представляет отдельную категорию информации и находится внутри пользовательского элемента управления с набором складных панелей (поэтому вы можете отображать или скрывать каждую категорию отдельно).
Я пытался добиться этого, переопределяя элементы управления контейнера OnLayout (), устанавливая все первые столбцы TableLayoutPanels для автоматического изменения размера, получая всю их ширину, находя максимум, а затем устанавливая все свои первые столбцы на фиксированный размер наибольшей ширины. Это работает, но выглядит ужасно каждый раз, когда происходит макет, когда все столбцы переходят к автоматическому размеру и затем возвращаются к фиксированному размеру.
Я предполагаю, что мне придется подключить ControlAdded и ControlRemoved для каждой таблицы, а затем SizeChanged для каждого дочернего элемента управления, чтобы узнать, когда изменился размер любого дочернего элемента управления, и затем каким-то образом вручную установить ширину столбца, но я не уверен, как надежно получить правильную ширину.
Я попробовал вариант первого метода - используя GetPreferredSize () для всех элементов управления в первых столбцах, чтобы попытаться найти наибольшую ширину, а затем установил для всех первых столбцов фиксированный размер, но, похоже, он возвращает ширину которые были немного малы. Должен ли я применить дополнительный интервал?
Кто-нибудь знает какой-либо способ попросить TableLayoutPanel выполнить автоматические вычисления без фактического применения их визуально? Или, может, лгать столам, чтобы «притвориться», что есть элемент управления определенной ширины, просто так, чтобы он учитывал это? Я не могу добавить фактические элементы управления, так как тогда они захотят выделить больше ячеек для них. Я попытался посмотреть на источник с помощью ILSpy, но это не очень красиво. Кажется, что большая часть работы выполняется классом TableLayout, который, конечно, является внутренним, и я не мог следить за тем, что он делал.
Спасибо за любые идеи ...