У меня есть несколько 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, который, конечно же, является внутренним, и я не мог понять, что он делает.
Спасибо за любые идеи...