Метка в конце XAMDataGrid
У меня есть XAMDataGrid, который используется для заполнения отчета приведенным ниже кодом.
где EGMList - это модель. введите описание изображения здесь
Reports.Xaml
<dataPresenter:XamDataGrid x:Name="datagdStatus" DataSource="{Binding EgmList}" DockPanel.Dock="Top"
HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" GroupByAreaLocation="None" FontFamily="Arial" FontSize="11" Visibility="Hidden">
<dataPresenter:XamDataGrid.FieldLayoutSettings>
<dataPresenter:FieldLayoutSettings RecordSelectorLocation="None" AllowAddNew="False" AllowDelete="False" AutoGenerateFields="False" />
</dataPresenter:XamDataGrid.FieldLayoutSettings>
<dataPresenter:XamDataGrid.FieldLayouts >
<dataPresenter:FieldLayout >
<dataPresenter:FieldLayout.Fields>
<dataPresenter:Field Name="Id" Label="{x:Static p:resource.tab_report_machineid}" Width="1.8*" Visibility="Collapsed">
<dataPresenter:Field.Settings>
<dataPresenter:FieldSettings AllowEdit="False" LabelTextAlignment="Center" EditorStyle="{StaticResource TextEditor}" LabelTextWrapping="Wrap" />
</dataPresenter:Field.Settings>
</dataPresenter:Field>
<dataPresenter:Field Name="MacAddress" Label= "{x:Static p:resource.UID}" Width="4*">
<dataPresenter:Field.Settings>
<dataPresenter:FieldSettings AllowEdit="False" LabelTextAlignment="Left" LabelTextWrapping="Wrap" />
</dataPresenter:Field.Settings>
</dataPresenter:Field>
<dataPresenter:Field Name="HouseNumber" Label= "{x:Static p:resource.tab_chn_houseNumber_Title}" Width="3.3*" >
<dataPresenter:Field.Settings>
<dataPresenter:FieldSettings AllowEdit="False" LabelTextAlignment="Left" />
</dataPresenter:Field.Settings>
</dataPresenter:Field>
<dataPresenter:Field Name="Type" Label="{x:Static p:resource.tab_report_type}" Width="2.5*" >
<dataPresenter:Field.Settings>
<dataPresenter:FieldSettings AllowEdit="False" LabelTextAlignment="Left" LabelTextWrapping="Wrap" />
</dataPresenter:Field.Settings>
</dataPresenter:Field>
<dataPresenter:Field Name="Status" Label="{x:Static p:resource.tab_redeem_status}" Width="5*" >
<dataPresenter:Field.Settings>
<dataPresenter:FieldSettings AllowEdit="False" LabelTextAlignment="Left" />
</dataPresenter:Field.Settings>
</dataPresenter:Field>
</dataPresenter:FieldLayout.Fields>
</dataPresenter:FieldLayout>
</dataPresenter:XamDataGrid.FieldLayouts>
</dataPresenter:XamDataGrid>
</DockPanel>
Reports.Xaml.cs
private void btnAllStatusPrint_Click(object sender, RoutedEventArgs e)
{
if (RedeemVoucherViewModel.EgmList.Count != 0)
{
Report reportObj = new Report();
// set scale mode
reportObj.ReportSettings.HorizontalPaginationMode = HorizontalPaginationMode.Scale;
reportObj.PageHeaderTemplate = this.Resources["PagePresenterHeaderTemplate_small"] as DataTemplate;
// reportObj.PageContentTemplate = this.TryFindResource("basicContentTemplate") as DataTemplate;
string siteControllerName = RedeemVoucherView.getSiteControllerName();
// reportObj.PageFooter = "Total Machines :23";
reportObj.PageHeader = string.Format("{0} {2} {1}", siteControllerName, DateTime.Now.ToString("dd/MM/yyyy"), Environment.NewLine);
reportObj.ReportSettings.PageSize = new Size(3.13, 6);
// create section and add it to report's section collection
reportObj.ReportSettings.Margin = new Thickness(0, 0, 0, 0);
EmbeddedVisualReportSection section = new EmbeddedVisualReportSection(datagdStatus);
reportObj.Sections.Add(section);
reportObj.Print(true, false);
rteventLogger.WriteLog(TraceEventType.Information, "All Status report is printed", WMSTrace.ScopeTypes.Internal);
}
else
{
MessageBoxHelper.Show("No content available to print", MessageBoxImage.Information);
}
}
Отчет печатается при вызове вышеупомянутой функции и заполняет содержимое EGMList в таблице отчетов.
Я хотел бы иметь в конце отчета ярлык с указанием количества записей /EGM
Попытка добавить его в PageFooter, но не повезло, поскольку он печатает на всех страницах.
Также попытался добавить другой раздел из кода позади, но это также отображает взятие другой страницы все вместе.
Любое предложение по этому вопросу, пожалуйста?
1 ответ
К сожалению, это не так легко сделать.
Сначала я подумал, что мне просто нужно определить новый FooterTemplate
для Report
и скрыть или показать нижний колонтитул в зависимости от того, находится он на последней странице или нет.
К сожалению, генерация отчета выполняется таким образом, что вы не знаете, сколько страниц будет сгенерировано в общей сложности, поэтому в шаблоне данных вы не знаете, используете ли вы шаблон последней страницы или нет.
Источник: Источник1
Источник2: Источник2
Временное решение
Я могу только предложить вам обходной путь. Если вы не против создать отчет дважды, это выполнимо. Сначала мы генерируем его, чтобы получить общее количество страниц, и мы можем установить FooterTemplate
используя это:
private void btnAllStatusPrint_Click(object sender, RoutedEventArgs e)
{
if (RedeemVoucherViewModel.EgmList.Count != 0)
{
Report reportObj = new Report();
// set scale mode
reportObj.ReportSettings.HorizontalPaginationMode = HorizontalPaginationMode.Scale;
reportObj.PageHeaderTemplate = this.Resources["PagePresenterHeaderTemplate_small"] as DataTemplate;
string siteControllerName = RedeemVoucherView.getSiteControllerName();
reportObj.PageFooter = string.Format("Total Machines: {0}", MyXamDataGrid.DataItems.Count);
reportObj.PageHeader = string.Format("{0} {2} {1}", siteControllerName, DateTime.Now.ToString("dd/MM/yyyy"), Environment.NewLine);
reportObj.ReportSettings.PageSize = new Size(3.13, 6);
// create section and add it to report's section collection
reportObj.ReportSettings.Margin = new Thickness(0, 0, 0, 0);
EmbeddedVisualReportSection section = new EmbeddedVisualReportSection(datagdStatus);
reportObj.Sections.Add(section);
var xamReportPreviewToGetTotalPageNumbers = new XamReportPreview();
xamReportPreviewToGetTotalPageNumbers.GeneratePreview(reportObj, false, false);
reportObj.PageFooterTemplate = GetDataTemplateForTotalPageNumbers(reportObj.PhysicalPageNumber);
reportObj.Print(true, false);
rteventLogger.WriteLog(TraceEventType.Information, "All Status report is printed", WMSTrace.ScopeTypes.Internal);
}
else
{
MessageBoxHelper.Show("No content available to print", MessageBoxImage.Information);
}
}
И GetDataTemplateForTotalPageNumbers
является следующим:
private DataTemplate GetDataTemplateForTotalPageNumbers(int totalPages)
{
var dataTemplate = new DataTemplate();
//set up the label
var labelFactory = new FrameworkElementFactory(typeof (Label)) {Name = "FooterLabel"};
labelFactory.SetValue(VisibilityProperty, Visibility.Collapsed);
labelFactory.SetValue(ContentProperty, new Binding());
dataTemplate.VisualTree = labelFactory;
var dataTrigger = new DataTrigger
{
Binding = new Binding("PhysicalPageNumber")
{
RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor)
{
AncestorType = typeof (ReportPagePresenter)
}
},
Value = totalPages
};
dataTrigger.Setters.Add(new Setter {
TargetName = "FooterLabel",
Property = VisibilityProperty,
Value = Visibility.Visible
});
dataTemplate.Triggers.Add(dataTrigger);
return dataTemplate;
}
Надеюсь, это поможет. Я бы использовал это с осторожностью, хотя. Потому что теперь мы генерируем отчет дважды (один раз для получения общего числа страниц и установки правильной таблицы данных, которая показывает нижний колонтитул на правильной странице, и еще раз для его печати), это приводит к двойному увеличению времени, поэтому, если у вас огромный сетка, это бы заморозило интерфейс на некоторое время.