Documente Academic
Documente Profesional
Documente Cultură
Introduccin Puede configurar opciones de impresin y llamar a una impresora mediante el cdigo, en lugar de mediante la UI de Crystal Reports. Para hacerlo, utilizar la clase PrintOptions y el mtodo PrintToPrinter() del modelo de objetos ReportDocument. Si el botn Imprimir de la barra de herramientas del control CrystalReportViewer satisface sus necesidades de impresin, no tendr que escribir cdigo para configurar opciones de impresin adicionales. Sin embargo, un mtodo basado en el cdigo para imprimir informes resulta til en casos especializados: Puede controlar cundo, dnde y cmo se realiza la impresin. Para hacerlo, deber desactivar el botn Imprimir de la barra de herramientas del control CrystalReportViewer y administra toda la impresin mediante cdigo.
Puede imprimir un informe en segundo plano, sin mostrarlo. Todas las opciones de configuracin de Imprimir las contiene el modelo ReportDocument, del que se puede crear una instancia y configurar sin mostrar nunca el informe con un control CrystalReportViewer.
Puede centralizar toda la impresin en el servidor Web de un cliente Web. Use el mtodo PrintToPrinter() para enviar tareas de impresin a una impresora conectada al servidor Web, en lugar de a una impresora local conectada al cliente Web.
Nota Esta funcionalidad de impresin de servidor no es tan amplia como el marco de trabajo de programacin de informes suministrado con Crystal Reports Server o BusinessObjects Enterprise. Para obtener ms informacin sobre estos productos, vea Opciones de actualizacin.
Para empezar este tutorial, agregar varios controles de lista para configurar opciones de impresin sobre el control CrystalReportViewer en el formulario Web o para Windows. A continuacin, en la clase de cdigo subyacente, crear una constante de cadena CURRENT_PRINTER, a la que asignar la ruta de la impresora que desee usar. Despus, enlazar cada control de lista a una enumeracin que contiene opciones de impresin para la orientacin del papel, su tamao y la configuracin dplex de la impresora. Un control de lista adicional muestra la configuracin del origen del papel personalizado de la impresora designada actualmente en la constante CURRENT_PRINTER. Para el control del origen del papel personalizado, crear un mtodo auxiliar que genera una instancia de PrinterSettings, la asigna a la impresora actual y devuelve una seleccin de orgenes de papel para dicha impresora. A continuacin, crear un mtodo de evento de clic de botn para el botn Imprimir informe. En dicho mtodo de evento, a cada propiedad de opcin de impresin se le asignar un valor basado en las selecciones realizadas en los controles de lista. Finalmente, se imprimir el informe en la impresora designada en la constante CURRENT_PRINTER. Cdigo de ejemplo Este tutorial incluye cdigo de ejemplo de C# y Visual Basic que muestra la versin finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de cdigo de ejemplo y trabajar con una versin finalizada.
El cdigo de ejemplo se almacena en carpetas que estn clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versin del cdigo de ejemplo son los siguientes: Sitio Web en C#: CS_Web_RDObjMod_SetPrintOptions Proyecto para Windows en C#: CS_Win_RDObjMod_SetPrintOptions Sitio Web en Visual Basic: VB_Web_RDObjMod_SetPrintOptions Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_SetPrintOptions
y y y y
Para localizar las carpetas que contienen estos ejemplos, vea Directorio del cdigo de ejemplo de los tutoriales.
Nota Este procedimiento slo funciona con un proyecto creado a partir de la Configuracin de proyectos. La configuracin de proyectos contiene referencias especficas a espacios de nombres y configuracin de cdigos necesarios para este procedimiento, que no se podr completar sin dicha configuracin. Por lo tanto, antes de empezar con este procedimiento, primero debe seguir los pasos de Configuracin de proyectos.
Abra el formulario Windows Forms en la vista Diseo. Haga clic en el control CrystalReportViewer para seleccionarlo. En la ventana Propiedades, establezca Dock en "Bottom". Ajuste el tamao del formulario para Windows de modo que quede suficiente espacio por encima del control CrystalReportViewer para otros controles. 5. En el Cuadro de herramientas, arrastre un control Label hasta la parte superior izquierda del formulario Windows Forms. 6. 7. 8. En la ventana Propiedades, defina la propiedad Text del control Label como "Orientacin del papel". En el Cuadro de herramientas, arrastre un control ComboBox a la derecha del control Label. En el Cuadro de herramientas, arrastre un segundo control Label justo debajo del primer control Label. 9. En la ventana Propiedades, defina la propiedad Text del segundo control Label como "Tamao del papel". 10. En el Cuadro de herramientas, arrastre un control ComboBox a la derecha del segundo control Label. 11. En el Cuadro de herramientas, arrastre un tercer control Label justo debajo del segundo control Label. 12. En la ventana Propiedades, defina la propiedad Text del tercer control Label como "Dplex de la impresora". 13. En el Cuadro de herramientas, arrastre un control ComboBox a la derecha del tercer control Label. 14. En el Cuadro de herramientas, arrastre un cuarto control Label justo debajo del tercer control Label. 15. En la ventana Propiedades, defina la propiedad Text del quinto control Label como "Origen del papel". 16. En el Cuadro de herramientas, arrastre un control ComboBox a la derecha del cuarto control Label. 17. En el Cuadro de herramientas, arrastre un control Button justo debajo del cuarto control Label. 18. En el Cuadro de herramientas, arrastre un quinto control Label a la derecha del control Button.
1. 2. 3. 4.
1. 2. 3. 4. 5. 6. 7. 8. 9.
En la primera lnea, haga clic en el control DropDownList (ComboBox) para seleccionarlo. En la ventana Propiedades, defina la propiedad ID (Name) como "paperOrientationList". En la segunda lnea, haga clic en el control DropDownList (ComboBox) para seleccionarlo. En la ventana Propiedades, defina la propiedad ID (Name) como "paperSizeList". En la tercera lnea, haga clic en el control DropDownList (ComboBox) para seleccionarlo. En la ventana Propiedades, defina la propiedad ID (Name) como "printerDuplexList". En la cuarta lnea, haga clic en el control DropDownList (ComboBox) para seleccionarlo. En la ventana Propiedades, defina la propiedad ID (Name) como "paperSourceList". En la quinta lnea, haga clic en el control Button para seleccionarlo.
y y
Defina la propiedad ID (Name) como "printReport". Establezca el valor de la propiedad Text en "Imprimir informe desde el servidor" (para un sitio Web) o "Imprimir informe" (para un proyecto para Windows).
y y
Defina la propiedad ID (Name) como "message". Establezca el valor de la propiedad Text para que est vaca.
Nota
5. 6.
Copiar cdigo
Copiar cdigo
Imports System.Collections
C#
Copiar cdigo
using System.Collections;
13. En la parte inferior de la clase, cree el mtodo auxiliar GetPaperSources() que devuelve un ArrayList. Visual Basic
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
Nota Varias de las clases usadas en este tutorial tienen nombres recurrentes, en los espacios de nombres System.Drawing.Printing y CrystalDecisions.Shared. Cuando se usa una clase que tiene un nombre recurrente en el tutorial, el espacio de nombres completo precede al nombre de clase para evitar la ambigedad respecto a qu espacio de nombres pertenece.
16. Visual Basic
Visual Basic
Copiar cdigo
myPrinterSettings.PrinterName = CURRENT_PRINTER
C#
Copiar cdigo
printerSettings.PrinterName = CURRENT_PRINTER;
25. Cree un bucle foreach que recorra cada instancia de PaperSource de la instancia de clase indizada de PaperSources. Visual Basic
Copiar cdigo
Copiar cdigo
Copiar cdigo
myArrayList.Add(myPaperSource.SourceName.ToString())
C#
Copiar cdigo
arrayList.Add(paperSource.SourceName.ToString());
27. Fuera del bucle foreach, devuelva el ArrayList desde el mtodo. Visual Basic
Copiar cdigo
Return myArrayList
C#
Copiar cdigo
return arrayList;
28. En el men Archivo, haga clic en Guardar todo. Para llenar los controles DropDownList Ahora, deber rellenar los tres primeros controles DropDownList con las enumeraciones del espacio de nombres CrystalDecisions.Shared. El cuarto control DropDownList se rellena con el mtodo GetPaperSources() recin creado. Abra el formulario Web Forms o Windows Forms. En el men Ver, haga clic en Diseador. Haga doble clic en un rea vaca del formulario. La pgina cambiar a la vista Cdigo y generar un mtodo de evento Page_Load() (para un formulario Web) o un mtodo de evento Form1_Load() (para un formulario para Windows). 4. Si est desarrollando un sitio Web, dentro del mtodo de evento Page_Load(), cree un bloque condicional Not IsPostBack. Visual Basic
1. 2. 3.
Copiar cdigo
Copiar cdigo
if (!IsPostBack) { }
Nota El bloque condicional Not IsPostBack encapsula el cdigo que slo se ejecuta la primera vez que se carga la pgina. Los controles se suelen enlazar a valores de datos dentro de bloques condicionales Not IsPostBack para que sus valores de datos (y los eventos de control subsiguientes) no se restablezcan cuando se vuelva a cargar la pgina.
5.
Las siguientes lneas de cdigo se colocan de forma diferente segn se trate de un proyecto para Windows o de un sitio Web: En los proyectos para Windows, las siguientes lneas de cdigo se deben colocar en el controlador de eventos Form_Load. En los sitios Web, las siguientes lneas de cdigo se deben anidar dentro del bloque condicional Not IsPostBack dentro del controlador de eventos Page_Load. c. Defina la propiedad DataSource de la instancia del control paperOrientationList con los valores de la enumeracin PaperOrientation. Visual Basic
y y
Copiar cdigo
paperOrientationList.DataSource = System.Enum.GetValues(GetType(PaperOrientation))
C#
Copiar cdigo
paperOrientationList.DataSource = System.Enum.GetValues(typeof(PaperOrientation));
d.
Defina la propiedad DataSource de la instancia del control paperSizeList con los valores de la enumeracin PaperSize. Visual Basic
Copiar cdigo
paperSizeList.DataSource = System.Enum.GetValues(GetType(PaperSize))
C#
Copiar cdigo
paperSizeList.DataSource = System.Enum.GetValues(typeof(PaperSize));
e. Defina la propiedad DataSource de la instancia del control printerDuplexList con los valores de la enumeracin PrinterDuplex. Visual Basic
Copiar cdigo
printerDuplexList.DataSource = System.Enum.GetValues(GetType(PrinterDuplex))
C#
Copiar cdigo
printerDuplexList.DataSource = System.Enum.GetValues(typeof(PrinterDuplex));
f. Defina la propiedad DataSource de la instancia del control paperSourceList como el mtodo auxiliar GetPaperSources() creado en la seccin anterior. Visual Basic
Copiar cdigo
paperSourceList.DataSource = GetPaperSources()
C#
Copiar cdigo
paperSourceList.DataSource = GetPaperSources();
g. Finalmente, si est creando un sitio Web, realice una llamada al mtodo DataBind() para enlazar los valores de los cuatro controles DropDownList. Visual Basic
Copiar cdigo
DataBind()
C#
Copiar cdigo
DataBind();
y y
Ninguno de los dos tipos (String o Integer) es compatible con la propiedad CustomPaperSource. Slo se le puede asignar el tipo System.Drawing.Printing.PaperSource. As, en esta seccin crear un mtodo auxiliar, GetSelectedPaperSource(), que determina y devuelve la instancia de PaperSource correcta, basada en el ndice seleccionado del control paperSourceList.
Para hacerlo, el mtodo recorre la coleccin PaperSources de la impresora seleccionada actualmente y, a continuacin, compara la propiedad de cadena SourceName de la instancia de PaperSource con el valor de la cadena del elemento seleccionado. Si se encuentra un PaperSource coincidente, el mtodo devuelve la instancia de PaperSource. Para crear el mtodo GetSelectedPaperSource() 1. En la parte inferior de la clase, cree el mtodo auxiliar GetSelectedPaperSource() que devuelve una instancia de PaperSource. Visual Basic
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
myPrinterSettings.PrinterName = CURRENT_PRINTER
C#
Copiar cdigo
printerSettings.PrinterName = CURRENT_PRINTER;
5. Cree un bucle foreach que recorra cada instancia de PaperSource de la instancia de clase indizada de PaperSources. Visual Basic
Copiar cdigo
Copiar cdigo
Nota El nombre de dicho elemento seleccionado es diferente del control DropDownList de un sitio Web comparado con un control ComboBox de un proyecto para Windows. Realice las instrucciones apropiadas que se indican a continuacin.
a. En un proyecto para Windows, cree el bloque condicional, que especifica el nombre del elemento seleccionado en el control paperSourceList como la propiedad SelectedText. Visual Basic
Copiar cdigo
Copiar cdigo
if (paperSource.SourceName == paperSourceList.SelectedText) { }
b. O, en un sitio Web, cree el bloque condicional, que especifica el nombre del elemento seleccionado en el control paperSourceList como la propiedad SelectedItem.Text. Visual Basic
Copiar cdigo
Copiar cdigo
if (paperSource.SourceName == paperSourceList.SelectedItem.Text) { }
7. Dentro del bloque condicional, asigne la instancia de PaperSource de la repeticin actual del bucle foreach a la instancia de selectedPaperSource que se declar en la parte superior del mtodo. Visual Basic
Copiar cdigo
selectedPaperSource = myPaperSource
C#
Copiar cdigo
selectedPaperSource = paperSource;
8.
Fuera del bloque condicional y del bucle foreach, devuelva la instancia de selectedPaperSource desde el mtodo. Visual Basic
Copiar cdigo
Return selectedPaperSource
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
myPrintOptions.PrinterName = CURRENT_PRINTER
C#
Copiar cdigo
printOptions.PrinterName = CURRENT_PRINTER;
4. Defina la propiedad PaperOrientation de la instancia de PrintOptions como la seleccin de enumeracin PaperOrientation que se obtiene del control paperOrientationList. Visual Basic
Copiar cdigo
Copiar cdigo
printOptions.PaperOrientation = (PaperOrientation)paperOrientationList.SelectedIndex;
5. Defina la propiedad PaperSize de la instancia de PrintOptions como la seleccin de enumeracin PaperSize que se obtiene del control paperSizeList. Visual Basic
Copiar cdigo
Copiar cdigo
printOptions.PaperSize = (PaperSize)paperSizeList.SelectedIndex;
6. Defina la propiedad PrinterDuplex de la instancia de PrintOptions como la seleccin de enumeracin PrinterDuplex que se obtiene del control printerDuplexList. Visual Basic
Copiar cdigo
Copiar cdigo
printOptions.PrinterDuplex = (PrinterDuplex)printerDuplexList.SelectedIndex;
7.
Defina la propiedad CustomPaperSource de la instancia de PrintOptions como el mtodo auxiliar GetSelectedPaperSource() creado anteriormente. Visual Basic
Copiar cdigo
myPrintOptions.CustomPaperSource = GetSelectedPaperSource()
C#
Copiar cdigo
printOptions.CustomPaperSource = GetSelectedPaperSource();
Copiar cdigo
SetPrintOptions()
C#
Copiar cdigo
SetPrintOptions();
5. Cree un bloque try/catch. Visual Basic
Copiar cdigo
Copiar cdigo
Copiar cdigo
Copiar cdigo
7.
An dentro del bloque try, defina la propiedad Text de la instancia de Label del mensaje como la constante de cadena MessageConstants.SUCCESS.
Nota La clase MessageConstants la cre durante Configuracin de proyectos. Si no lo hizo, deber crear esta clase antes de continuar. Vea Agregar una clase para mensajes de error.
8. Visual Basic
Copiar cdigo
Copiar cdigo
1. 2. 3.
5.
Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuracin.
Nota Las opciones disponibles en los cuadros de dilogo, y los nombres y ubicaciones de los comandos de men que se ven podran diferir de lo que se describe en la Ayuda, segn los valores de configuracin o de edicin activos. Esta pgina de Ayuda se ha redactado teniendo en cuenta la Configuracin general de desarrollo. Para cambiar la configuracin, elija la opcin Importar y exportar configuraciones en el men Herramientas. Para obtener ms informacin, vea Valores de configuracin de Visual Studio.
Crear la aplicacin Para iniciar el proyecto, cree un formulario en el que los usuarios puedan seleccionar un directorio, un archivo del directorio y, a continuacin, la informacin sobre el archivo que desean recuperar.
Visual Studio agregar el proyecto al Explorador de soluciones y se abrir el Diseador de Windows Forms. 4. Agregue los controles de la siguiente tabla al formulario y establezca los correspondientes valores para sus propiedades.
Objeto TextBox
Button
Name Text
btnSubmit Enviar
Button
Name Text
btnExamine Examinar
ComboBox
Name Text
CheckBox
CheckBox
CheckBox
Mostrar el directorio actual La aplicacin FileExplorer necesita un punto de inicio. En consecuencia, el control representa la ruta de acceso actual.
txtDirectory TextBox
Form1_Load.
Copiar cdigo
txtDirectory.Text = My.Computer.FileSystem.CurrentDirectory
3. Ejecute el programa para comprobar que se devuelve la ruta de acceso correcta. El control
actual.
Cambiar directorios
Dado que es posible que un usuario desee seleccionar archivos de un directorio diferente, la aplicacin utiliza la misma propiedad para cambiar de directorio. Para cambiar a un directorio diferente, el usuario escribe una nueva ruta de acceso en el control
txtDirectory TextBox.
btnSubmit.
Se abrir el Editor de cdigo. 2. Agregue el cdigo siguiente al controlador de eventos clic. Visual Basic
Copiar cdigo
Dim NewPath As String ' NewPath holds the path the user has entered. NewPath = txtDirectory.Text ' Change the location to NewPath. My.Computer.FileSystem.CurrentDirectory = NewPath
Comprobar si se escribi una ruta de acceso vlida Utilice una instruccin Try...Catch para detectar excepciones que surgen de escribir una ruta de acceso en blanco o no vlida.
NewPath, agregue una instruccin Try en su propia lnea, como se indica a continuacin. Si
presiona la tecla de retorno, el Editor de cdigo insertar automticamente las instrucciones
ex As Exception y End Try. Qutelas, agregar las suyas propias en el paso siguiente.
Visual Basic
Copiar cdigo
Try
3. Despus de la lnea de cdigo
My.Computer.FileSystem.CurrentDirectory =
Visual Basic
Copiar cdigo
' This checks to make sure the path is not blank. Catch ex As Exception When NewPath = "" ErrorMessage = "You must enter a path." ' This catches errors caused by a path that is not valid. Catch ErrorMessage = "You must enter a valid path. _ "letter." Finally ' Display the error message only if one exists. If ErrorMessage <> Nothing Then MsgBox(ErrorMessage) End If End Try
Mostrar el contenido del directorio en un control ComboBox Para permitir que la aplicacin muestre el contenido del directorio actual, puede utilizar el mtodo My.Computer.FileSystem.GetFiles, que devuelve una coleccin de cadenas que representan los nombres de los archivos en el directorio. Puede utilizar comodines con GetFiles para seleccionar slo archivos de un modelo determinado. En este ejemplo, slo se devuelven los archivos que tienen la extensin .txt.
"to access a different drive, remember to include the drive " &
Copiar cdigo
seleccionar un archivo especfico para examinarlo. Para probar la aplicacin, ejectela primero en un directorio que no contenga archivos .txt y, a continuacin, en uno que contenga ms de un archivo .txt. En el primer caso, la aplicacin muestra el mensaje de error correspondiente. En el segundo, la aplicacin crea, en el control ComboBox, una lista de todos los archivos .txt del directorio especificado en el control
txtDirectory TextBox.
Cree un controlador de evento clic para confirmar la seleccin de un archivo. Visual Basic
Copiar cdigo
que el usuario especifique la informacin de la que se informa. Por ejemplo, es posible que un usuario slo desee saber la fecha en la que se tuvo acceso al archivo por ltima vez. Es posible que otro usuario desee conocer tambin el tamao de un archivo. Los usuarios pueden activar o desactivar las casillas de verificacin (chkLastAccess,
btnExamine_Click despus de
(lstFilePick.SelectedItem):
Visual Basic
Copiar cdigo
Dim stringlength As String stringLength = "The file's length, in bytes, is: " Dim stringLastAccess As String stringLastAccess = "The file was last accessed on: " Dim LastAccess As Date Dim Length As Long Dim FirstLine As String = "" Dim FinalString As String = "" Dim NewName As String NewName = CType(lstFilePick.SelectedItem, String) If NewName = Nothing Then MsgBox("You must select a file to examine.") Exit Sub End If
El mtodo My.Computer.FileSystem.GetFileInfo devuelve un objeto FileInfo que se puede consultar para obtener informacin sobre un archivo. 2. Agregue el cdigo siguiente al final del evento Visual Basic
btnExamine_Click.
Copiar cdigo
' Check last access time. If chkLastAccess.Checked = True Then LastAccess = thisFile.LastAccessTime End If
La propiedad LastAccessTime determina la hora del ltimo acceso al archivo. El valor Date devuelto indica la fecha y la hora en que se cre un archivo o en que fue modificado por ltima vez. 1. Agregue el cdigo siguiente al final del evento Visual Basic
btnExamine_Click.
Copiar cdigo
End If
La propiedad Length, que determina la longitud del archivo, devuelve un valor de tipo Long que especifica la longitud del archivo en bytes. Mostrar los resultados Para completar la funcionalidad de la aplicacin, un MsgBox informa de la informacin recopilada.
Copiar cdigo
' Add to the messagebox. FinalString = FinalString & stringLastAccess & LastAccess & "." _ & vbCrLf
2. Al final de la instruccin
Visual Basic
Copiar cdigo
' Add to the messagebox. FinalString = FinalString & stringlength & CStr(Length) & "." _ & vbCrLf
3. Al final de la instruccin
Visual Basic
Copiar cdigo
Es posible que el usuario desee guardar los resultados de examinar un archivo. En consecuencia, debe agregar cdigo que compruebe si existe un archivo de registro, cree uno si es necesario y, a continuacin, escriba los resultados en el archivo de registro.
btnExamine_Click.
Copiar cdigo
' Check to see if results should be saved. If chkSave.Checked = True And FinalString <> "" Then My.Computer.FileSystem.WriteAllText("log.txt", FinalString, True) End If
Para probar la aplicacin
1. En el directorio de su eleccin, cree un archivo de texto denominado lnea siguiente: "sta es la primera lnea del primer archivo. La aplicacin FileExplorer slo examina archivos de texto." 2. En el mismo directorio, cree un segundo archivo de texto denominado test2.txt con la primera lnea siguiente: "sta es la primera lnea del segundo archivo. La aplicacin FileExplorer slo examina archivos de texto." 3. 4. Inicie la aplicacin. Escriba una ruta de acceso no vlida y haga clic en Enviar. Aparecer el siguiente mensaje: "You must enter a valid path. If trying to access a different drive, remember to include the drive letter." 5. Escriba la ruta de acceso al directorio que almacena test.txt y haga clic en Enviar. El control 6.
lstFilePick ComboBox mostrar los archivos de texto. lstFilePick ComboBox. Asegrese de que estn activadas
todas las casillas de verificacin y, a continuacin, haga clic en Examinar. El formulario de resultados incluye la fecha del ltimo acceso y la longitud. 7. Seleccione test2.txt en el control
Aparecer el siguiente mensaje de error : "No file attribute checkboxes selected." 8. Seleccione Hora del ltimo acceso y Guardar resultados, y haga clic en Examinar. El formulario de resultados muestra slo la hora del ltimo acceso. 9. Cierre FileExplorer. Dado que activ la opcin Guardar resultados, FileExplorer gener un archivo de registro denominado