Имеется потоковый документ FlowDocument, содержащий в себе контейнер InlineUIContainer с таблицей DataGrid. Длина таблицы DataGrid превышает установленный фиксированный размер flowDocument в FlowDocumentPageViewer, и следовательно появляется вертикальный ScrollBar у таблицы и часть таблицы не переходит на следующую страницу.
Проблема в том, что таблица должна печататься из flowDocument полностью, на несколько страниц, а печатается только её видимая часть на одну страницу... у Paragraph, DataGrid и у InlineUIContainer ставил невозможность прокручивать содержимое через свойство ScrollViewer.CanContentScroll="False" - полоса прокрутки не пропадает.
<FlowDocumentPageViewer Name="fdpvDocumentViewer" Margin="10,10,10,52" Background="#FFF0E9E8">
<FlowDocument Name="fdPage" PageHeight="1123" PageWidth="794" Background="White" PagePadding="30,30,10,30" ColumnWidth="1000" FontFamily="Times New Roman">
<Paragraph ScrollViewer.CanContentScroll="False">
<InlineUIContainer ScrollViewer.CanContentScroll="False">
<DataGrid x:Name="dgDeviceList" Width="740" RowDetailsVisibilityMode="Collapsed" CanUserAddRows="False" RowHeaderWidth ="0" ColumnWidth="*" ScrollViewer.CanContentScroll="False" AutoGenerateColumns="False" CanUserSortColumns="False" CanUserReorderColumns="False" CanUserResizeColumns="False" EnableRowVirtualization="False" UseLayoutRounding="False">
<DataGrid.Columns>
...Столбцы с привязкой данных...
</DataGrid.Columns>
</DataGrid>
</InlineUIContainer>
</Paragraph>
....
Может у кого будут другие предложения реализации вывода таблицы DataGrid на несколько страницах FlowDocumentPageViewer. Может обернуть таблицу ещё в какой контейнер?
Полоса прокрутки появляется, потому что высоты элемента не хватает для отображения всех строк. Избавиться от нее легко, установив очень большую высоту для DataGrid, но что толку? FlowDocument не поддерживает постраничный вывод отдельного InlineUIContainer (как и BlockUIContainer). Может и можно изобрести какой-то костыльный класс, который будет резать DataGrid на отдельные Bitmap по размеру страницы и отдавать их отдельными UIElement, но нужно ли оно? Качество изображения будет явно не на высоте.
Лучше использовать класс Table, который поддерживает постраничный вывод внутри FlowDocument. Как-то так:
using System.Data;
using System.Windows.Documents;
public static Table CreateTable(DataTable dt)
{
Table t = new Table();
TableCell cell;
TableRow trow;
var rows = new TableRowGroup();
t.RowGroups.Add(rows);
//параметры таблицы
t.BorderBrush = Brushes.Black;
t.BorderThickness = new Thickness(1);
t.CellSpacing = 0;
//заголовки столбцов
trow = new TableRow();
foreach (DataColumn col in dt.Columns)
{
t.Columns.Add(new TableColumn());
cell = new TableCell(new Paragraph(new Run(col.Caption)));
cell.BorderBrush = Brushes.Black;
cell.BorderThickness = new Thickness(1);
trow.Cells.Add(cell);
}
rows.Rows.Add(trow);
//строки
foreach (DataRow r in dt.Rows)
{
trow = new TableRow();
foreach (DataColumn col in dt.Columns)
{
cell = new TableCell(new Paragraph(new Run(r[col].ToString())));
cell.BorderBrush = Brushes.Black;
cell.BorderThickness = new Thickness(1);
trow.Cells.Add(cell);
}
rows.Rows.Add(trow);
}
return t;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//создадим DataTable с тестовыми данными
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("X"));
dt.Columns.Add(new DataColumn("Y"));
for (int i = 0; i < 100; i++)
{
var row = dt.NewRow();
row[0] = i;
row[1] = Math.Round(Math.Sin(i*0.1),2);
dt.Rows.Add(row);
}
//создадим таблицу на основе DataTable
Table t = CreateTable(dt);
//создадим документ
FlowDocument fd= new FlowDocument(t);
fdpvDocumentViewer.Document = fd;
}
Для удобства работы при формировании потоковых документов нашёл одну свободную библиотеку, называется CodeReason.Reports Удобно выводить данные в таблицы и формировать другие различные отчёты с графиками, диаграммами и т.д.
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В принципе простые элементы добавления мне известныТипа:
Есть chromedriverЯ хочу запустить его в 3 потока и слать данные этим инстансам из списка