Personalizando el botón exportar del visor de Crystal Report
En una aplicación de escritorio en la que estoy trabajando uso el componente "Crystal Report Viewer" para visualizar mis informes.
El visor ofrece bastante funcionalidad, pero como muchas veces ocurre, no siempre se adecua al 100% a lo que quiere en cliente y toca buscar la mejor manera de personalizar.
En este caso, necesitaba personalizar algunos aspectos de la opción de exportar. Una opción es hacerte tu propia barra de herramientas pero en este caso, yo quería usar toda la funcionalidad posible y escribir simplemente el código para personalizar los aspectos que quería el cliente.
La solución que he encontrado después de navegar y pegarme un buen rato es sustituir el botón exportar por uno personalizado, pero sin que visualmente se vea afectado nada:
- Buscar una referencia al control de exportar que viene por defecto.
- Crear un botón nuevo y copiar las propiedades.
- Añadir el nuevo botón a la barra.
- Incluir un manejador del evento "Click" para el nuevo botón.
- Ocultar el botón de exportar por defecto.
- Incluir el código necesario en el manejado del evento Click para exportar el informe.
El código sería así.....
private void ChangeExportButton()
{
foreach (Control ctrl in myCrystalReportViewer.Controls)
{
//Buscar toolstrip del visor de informes
if (ctrl is ToolStrip)
{
ToolStrip ts = (ToolStrip)ctrl;
foreach (ToolStripItem tsi in ts.Items)
{
//Buscar el botón exportar por un ImageIndex
if (tsi is ToolStripButton && tsi.ImageIndex == 8)
{
ToolStripButton crXb = (ToolStripButton)tsi;
//Clonar el aspecto
ToolStripButton tsb = new ToolStripButton();
tsb.Size = crXb.Size;
tsb.Padding = crXb.Padding;
tsb.Margin = crXb.Margin;
tsb.TextImageRelation = crXb.TextImageRelation;
tsb.Text = crXb.Text;
tsb.ToolTipText = crXb.ToolTipText;
tsb.ImageScaling = crXb.ImageScaling;
tsb.ImageAlign = crXb.ImageAlign;
tsb.ImageIndex = crXb.ImageIndex;
tsb.Visible = crXb.Visible;
tsb.Enabled = crXb.Enabled;
//Añadir el nuevo botón
ts.Items.Insert(0, tsb);
tsb.Click += new EventHandler(Export_Click);
break;
}
}
}
}
//Ocultar el botón por defecto
this.myCrystalReportViewer.ShowExportButton = false;
}
private void Export_Click(object sender, EventArgs e)
{
SaveFileDialog saveDiag = new SaveFileDialog();
saveDiag.Title = "Exportar Informe";
saveDiag.Filter = "Adobe Acrobat (*.pdf)|*.pdf|Microsoft Excel (*.xls)|*.xls|Sólo datos de Microsoft Excel (*.xls)|*.xls|Microsoft Word (*.doc)|*.doc|Formato de texto enriquecido (*.rtf)|*.rtf";
saveDiag.FilterIndex = 1;
if (saveDiag.ShowDialog() == DialogResult.OK)
{
DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions();
ReportDocument rptDoc = (ReportDocument)crystalReportViewer1.ReportSource;
ExportOptions crExportOptions = rptDoc.ExportOptions;
crDiskFileDestinationOptions.DiskFileName = saveDiag.FileName;
crExportOptions.ExportDestinationOptions = crDiskFileDestinationOptions;
crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
switch (saveDiag.FilterIndex)
{
case 1: // pdf
crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
break;
case 2: // xls
crExportOptions.ExportFormatType = ExportFormatType.Excel;
break;
case 3: // xls
crExportOptions.ExportFormatType = ExportFormatType.ExcelRecord;
break;
case 4: // doc
crExportOptions.ExportFormatType = ExportFormatType.WordForWindows;
break;
case 5: // rtf
crExportOptions.ExportFormatType = ExportFormatType.RichText;
break;
}
rptDoc.Export(crExportOptions);
}