#c# #printing #tabular #flowdocument
#c# #печать #табличный #flowdocument
Вопрос:
У меня есть таблица, которую я печатаю. Я добавил границы ко всем ячейкам, но у меня возникает проблема, когда таблица переходит на новую страницу / выходит из нее. Затем граница перемещается / остается на странице в зависимости от доступного пространства, занимаемого каждой ячейкой. Возможно ли сделать эту строку зависимой в sted?
Вот изображение проблемы
Серая линия — это сдвиг страницы.
Вот как я сделал
foreach (Task task in TasksToShow)
{
myTable.RowGroups[0].Rows.Add(new TableRow());
currentRow = myTable.RowGroups[0].Rows[rowCount ];
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.TaskID.ToString()))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.TaskName))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.TaskResponsible))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.TaskResponsibleDepartment))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.Category))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.Status))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.Priority.ToString()))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.StartDate.ToString("dd/MM/yy")))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.ActualHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.EstimatedHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.EstimatedDeploymentDate.ToString("dd/MM/yy")))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.DesiredImplementationDate.ToString("dd/MM/yy")))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.APP.StartDate.ToString("dd/MM/yy")))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.APP.EstimatedHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.APP.ActualHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.IN.StartDate.ToString("dd/MM/yy")))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.IN.EstimatedHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.IN.ActualHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.SIS.StartDate.ToString("dd/MM/yy")))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.SIS.EstimatedHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.SIS.ActualHours.TotalHours.ToString() "h"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run(task.Tags))));
currentRow.FontSize = 10;
currentRow.FontWeight = FontWeights.Normal;
for (int n = 0; n < currentRow.Cells.Count; n )
{
currentRow.Cells[n].BorderThickness = new Thickness(1, 1, 1, 1);
currentRow.Cells[n].BorderBrush = Brushes.Black;
}
}
Также есть ли способ сделать ширину ячеек зависимой от самой большой ячейки, а не просто сделать все ячейки одинаковой ширины?
Надеюсь, вы сможете помочь.
Комментарии:
1. Святые угодники. 1 слово, рефакторинг!
2. Что вы имеете в виду? Я просто добавляю сюда данные. Я не вижу, как сделать это лучше!?
3. Как насчет:
void AddRow(data) { currentRow.Cells.Add(new TableCell(new Paragraph(new Run(data)))); }
4. Да, вы правы, это упростило бы обслуживание… но это все еще не отвечает на мой вопрос. Сейчас я произведу некоторый рефакторинг.
Ответ №1:
Я нашел решение, которое, по крайней мере, делает его одинаковым на всем протяжении, но я пока не полностью удовлетворен им. Я только что изменил тонкость в последнем цикле for на это:
for (int n = 0; n < currentRow.Cells.Count; n )
{
currentRow.Cells[n].BorderThickness = new Thickness(0, 2, 1, 0);
currentRow.Cells[n].BorderBrush = Brushes.Black;
}
Ответ №2:
Возможно, было бы лучше добавить границу ко всем ячейкам и самой таблице. Если таблица не имеет границы, границы ячеек на границе таблицы имеют ширину только половины линии сетки.
Ширина линии сетки между 2 ячейками в одной строке состоит из ширины границы ячейки левой ячейки плюс ширины границы ячейки правой ячейки. Если у ячейки нет соседа, ширина сетки в ней равна только половине других линий сетки. Добавление границы для таблицы добавляет границу несуществующего соседа.
table.BorderBrush = Brushes.Black,
table.BorderThickness = new Thickness(.5)
cell.BorderBrush = Brushes.Black,
cell.BorderThickness = new Thickness(.5)
Я знаю, это не решает вашу проблему, но, по крайней мере, линии сетки выглядят приятнее.