TableLayoutPanel выровненный по правому краю текст не печатается

#vb.net #winforms #printing #tablelayoutpanel

Вопрос:

Я пытаюсь распечатать панель TableLayoutPanel с 3 столбцами, первые два столбца должны быть выровнены по левому краю, а третий-по правому. Я создаю метки внутри панели TableLayoutPanel, используя следующий код:

 TableLayoutPanel.Controls.Add(New Label() With {.Text = "1000 meter", .AutoSize = False, .Width = 150, .TextAlign = ContentAlignment.MiddleRight}, 2, 1)
 

Кто — нибудь знает, почему это происходит? Спасибо за уделенное время!

Обновить:

Я добавил .Dock = DockStyle.Fill к ярлыку и использую этот код:

  Dim sf = New StringFormat()
 sf.Alignment = StringAlignment.Far
 For Each ctrl As Control In TableLayoutPanel.Controls
 e.Graphics.DrawString(ctrl.Text, ctrl.Font, Brushes.Black, Panel.PointToClient(TableLayoutPanel.PointToScreen(ctrl.Bounds.Location)), sf)
 Next
 

Теперь все выровнено правильно, но мне нужен только последний столбец, чтобы выровнять его правильно.
Спасибо!

Комментарии:

1. Я сказал вам в вашем предыдущем вопросе, что сначала вам нужно было провести некоторые исследования, и, похоже, вы этого не сделали. Если бы вы прочитали документацию по DrawString методу, который вы уже используете для печати текста, вы бы знали, что он позволяет указывать выравнивание в пределах области. Учитывая , что вы уже используете местоположение Label , должно быть очевидно, что область, в которой вы хотите выровнять, находится в пределах Label .

2. Не могли бы вы привести мне, пожалуйста, пример? я уже пробовал использовать sf. Выравнивание строк=выравнивание строк. Далеко и фантастически. Выравнивание = выравнивание строк. Далеко, но у меня это не работает.

3. Установите Dock для свойств меток DockStyle.Fill значение, а AutoSize для свойств false -значение . Таким образом, при печати вы получите границы ячейки, а текст в последнем столбце будет выровнен правильно. Установите sf.Alignment = StringAlignment.Near; для выравнивания влево и sf.Alignment = StringAlignment.Far; для выравнивания вправо.

4. спасибо за ваш комментарий!, я обновил вопрос тем, что происходит сейчас. У вас есть какие-нибудь идеи, как это исправить? Спасибо!

5. Ох. Какой беспорядок мы здесь устроили! Теперь проигнорируйте мой первый комментарий и попробуйте следующее: в первой For Each строке добавьте: sf.Alignment = If(TableLayoutPanel.GetColumn(ctrl) < 2, StringAlignment.Near, StringAlignment.Far) . а остальное оставь себе. И утилизируйте sf после For Each блока. sf.Dispose()