Почему элементы управления, помещенные в 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 в разделе "Позиционирование элементов управления внутри ячеек с использованием стыковки и привязки".

Другие вопросы по тегам