Почему элементы управления, помещенные в TableLayoutPanels, не "привязываются" к своим "ячейкам"?
Я динамически создаю TableLayoutPanel, а затем динамически создаю Labels и TextBoxes для размещения внутри него.
Казалось бы логичным, что я мог бы просто назначить количество столбцов и строк в TableLayoutPanel:
tableLayoutPanelGreatGooglyMoogly = new TableLayoutPanel();
tableLayoutPanelGreatGooglyMoogly.RowCount = NUMBER_OF_ROWS;
tableLayoutPanelGreatGooglyMoogly.ColumnCount = NUMBER_OF_COLUMNS;
... создать элементы управления для размещения внутри него:
Label lbl = new Label();
lbl.Parent = tableLayoutPanelGreatGooglyMoogly;
. . .
... и затем поместите созданный элемент управления [s] в указанную "ячейку" (столбец и строку):
tableLayoutPanelGreatGooglyMoogly.SetColumn(lbl, ACol); // "ACol" is the current column
tableLayoutPanelGreatGooglyMoogly.SetRow(lbl, i); // "i" is the current row
... но это не работает - ни в том случае, если я указываю значения ширины и высоты для динамически создаваемых дочерних элементов управления, либо если я не делаю (в этом случае они слишком велики - в частности, их ширина слишком велика).
ОБНОВИТЬ
Я добавил этот код, и это не имеет значения:
// ROWS
tableLayoutPanelGreatGooglyMoogly.RowCount = NUMBER_OF_ROWS;
TableLayoutRowStyleCollection rowStyles =
this.tableLayoutPanelGreatGooglyMoogly.RowStyles;
foreach (RowStyle rStyle in rowStyles) {
rStyle.SizeType = SizeType.Percent;
rStyle.Height = 8;
}
// COLUMNS
tableLayoutPanelGreatGooglyMoogly.ColumnCount = TOTAL_NUMBER_OF_COLUMNS;
TableLayoutColumnStyleCollection columnStyles =
this.tableLayoutPanelGreatGooglyMoogly.ColumnStyles;
foreach (ColumnStyle cStyle in columnStyles) {
cStyle.SizeType = SizeType.Percent;
cStyle.Width = 12;
}
ОБНОВЛЕНИЕ до ОБНОВЛЕНИЯ
Я вижу, что во время разработки Label или TextBox (предположительно, любой элемент управления) имеет свойство Cell[col,row]. Я хотел бы получить доступ к этому динамически, если это не только для чтения, чтобы я мог установить:
lbl.Cell = i,i
txtbox.Cell = i+1,i
Это возможно сделать в коде? Свойство "Ячейка", похоже, не было распознано (понятно, я полагаю) в то время.
ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ ОБНОВЛЕНО
Я добавил эту строку кода:
tableLayoutPanelGreatGooglyMoogly.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
... и теперь я вижу, что метки и текстовые поля на самом деле находятся в ячейках (столбцах и строках), и я ожидаю, что они будут обитать.
Однако мне нужно, чтобы метки двигались вниз от верхнего левого угла их ячеек к центру ячейки (как по вертикали, так и по горизонтали).
Даже во время разработки (с "тестом" / временным TableLayoutPanel на форме) добавленные метки не реагируют на изменения свойства TextAlign, когда они находятся внутри ячейки TableLayoutPanel - независимо от того, что я установил для TextAlign ("Средний центр") кажется наиболее разумным), они упорно остаются прикреплены к верхней левой части ячейки.
Аналогично, изменение меток Location.X и Location.Y во время разработки ничего не делает. Метки прикрепляются к северо-западному углу клетки, как ракушка к давно потерянному якору.
1 ответ
Важной частью использования GridLayoutPanel, которая редко упоминается, является использование свойства Anchor в дочерних элементах управления.
Свойство Anchor определяет, на какой край ячейки распространяется каждый дочерний элемент управления.
Когда вы создаете свои ярлыки, вы делаете это так:
Label lbl = new Label();
lbl.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
lbl.Parent = tableLayoutPanelGreatGooglyMoogly;
Следует растянуть метки до полного размера ячейки.
См. http://msdn.microsoft.com/en-us/library/w4yc3e8c(v=vs.80).aspx в разделе "Позиционирование элементов управления внутри ячеек с использованием стыковки и привязки".