#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()