ВБ2010. Может быть немного сложно понять, но у меня есть список классов, и одно поле представляет собой строковое сообщение. Я вывожу эти сообщения в документ RTF, но хочу максимально использовать горизонтальное пространство, поэтому я пытаюсь динамически создать таблицу и разместить как можно больше сообщений в одной строке, а затем в другой строке. При этом я поддерживаю максимально возможную ширину строки.
Public Class TripInfo
Public SysId As String = ""
Public CreateDate As DateTime
Public OutMessage As String = ""
Public OutMessageWidth As Integer = 0 'the width of the message in char count up to first LF
End Class
Dim myTrips1 as New List(Of TripInfo)
Dim myTrips2 as New List(Of TripInfo)
Поэтому, когда я перебираю списки, я хочу создавать строки, длина которых не превышает 45 символов. Что-то вроде:
---------------------------------------------
|"Message1 |"Message2 |"Much longer message |
| Trip1 "| Trip2" | with two lines" |
---------------------------------------------
|"message is even longer than the others" |
---------------------------------------------
|"trip is ok |"trip was cancelled due to CW |
| enroute" | must log to system" |
---------------------------------------------
|"Message3 |"Message4 |"Message5 |"Message6"|
| Trip3 "| Error" | Stop" | |
---------------------------------------------
*Обратите внимание, что само сообщение может занимать более 1 строки с LF для отображения многострочного сообщения.
У меня есть временной код для написания RTF-кода для таблиц, и я заменил поддельные сообщения несколькими встроенными LF, и результат выглядит хорошо.
Dim sbTable As New StringBuilder
sbTable.Append("\pard \trowd\trql\trgaph108\trleft36\cellx1636\cellx3236\cellx4836\intbl R1C1\cell R1C2\cell R1C3\cell\row \pard")
sbTable.Append("\pard \trowd\trql\trgaph108\trleft36\cellx4642\intbl R1C1\cell\row \pard")
sbTable.Append("\pard \trowd\trql\trgaph0\trleft36\cellx4642\cellx5500\intbl R1C1\cell R1C2\cell\row \pard")
Однако я просто не могу понять, как даже начать это делать динамически. Кажется, мне может понадобиться сделать две итерации. Один для разбиения сообщений на строки, а другой для фактического написания кода RTF. У меня пока есть псевдокод, но мне нужна помощь с моей логикой.
dim v as integer = 0 'total width of current row
For each t as TripInfo in myTrips1 and myTrips2
if (t.OutMessageWidth added to v) > 45 then
start new row and append
else
append to current row
endif
Next t