Граница ячейки в таблице

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

Я знаю, это не решает вашу проблему, но, по крайней мере, линии сетки выглядят приятнее.