Unidad I – Aplicación de controles 1.3 CONTROLES DE DIÁLOGO Los cuadros de diálogo se utilizan para obtener datos de entrada de los usuarios. Puede crear sus propios cuadros de diálogo o utilizar los cuadros de diálogo integrados, como FolderBrowserDialog y FontDialog. En esta sección proporcionan vínculos a temas que muestran cómo crear cuadros de diálogo y utilizar cuadros de diálogo integrados comunes en los programas. Recuperar datos de un cuadro de diálogo Los cuadros de diálogo permiten a un programa interactuar con los usuarios y recuperar datos que los usuarios han escrito en el cuadro de diálogo para el uso de la aplicación. Hay varios cuadros de diálogo integrados que puede utilizar en sus aplicaciones. Para obtener más información, vea Usar cuadros de diálogo integrados en una aplicación. También puede crear sus propios cuadros de diálogo. Una tarea común en el desarrollo con Windows Forms consiste en mostrar un cuadro de diálogo para recopilar información cuando un usuario hace clic en un botón del formulario principal de una aplicación. Puede ver un ejemplo de esto en el IDE de Visual C# Express. Al agregar un control ListBox a un formulario, puede hacer clic en la propiedad Elementos en la ventana Propiedades para mostrar un cuadro de diálogo. Este cuadro de diálogo permite escribir rápidamente texto en líneas independientes de un cuadro de texto. La aplicación agrega a continuación cada línea de texto al control ListBox al hacer clic en Aceptar. Si desea permitir a los usuarios agregar sus propios elementos a un cuadro de lista en su aplicación, puede crear su propio cuadro de diálogo de editor de cadenas. a) ColorDialog (Clase) Representa un cuadro de diálogo común que muestra los colores disponibles, así como los controles que permiten a los usuarios definir colores personalizados. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: public class ColorDialog : CommonDialog Se debe invocar al miembro heredado ShowDialog para crear este cuadro de diálogo común específico. Se puede reemplazar HookProc para implementar funcionalidad específica de enlace de cuadros de diálogo. Se utiliza Color para recuperar el color seleccionado por el usuario. Cuando se crea una instancia de ColorDialog, se establecen algunas propiedades de lectura y escritura en sus valores iniciales. Para obtener una lista de esos valores, vea el constructor ColorDialog. El siguiente ejemplo ilustra la creación de una nueva instancia de ColorDialog. Este ejemplo requiere que se llame al método desde un formulario existente que incluya un control TextBox y otro control Button. private void button1_Click(object sender, System.EventArgs e) { ColorDialog MyDialog = new ColorDialog(); // Keeps the user from selecting a custom color. MyDialog.AllowFullOpen = false ; // Allows the user to get help. (The default is false.) MyDialog.ShowHelp = true ; // Sets the initial color select to the current text color. MyDialog.Color = textBox1.ForeColor ; // Update the text box color if the user clicks OK if (MyDialog.ShowDialog() == DialogResult.OK) textBox1.ForeColor = MyDialog.Color; } L.I. José Raymundo Ceja Vázquez 1 Unidad I – Aplicación de controles b) FontDialog (Clase) Pide al usuario que elija una fuente de entre todas las instaladas en el equipo local. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: public class FontDialog : CommonDialog Se debe invocar al miembro heredado ShowDialog para crear este cuadro de diálogo común específico. Se puede reemplazar HookProc para implementar funcionalidad específica de enlace de cuadros de diálogo. Cuando se crea una instancia de FontDialog, se establecen algunas propiedades de lectura y escritura en sus valores iniciales. Para obtener una lista de esos valores, vea el constructor FontDialog. En el siguiente ejemplo de código se utiliza ShowDialog para mostrar FontDialog. En este código se requiere que ya se haya creado un objeto Form que incluya un objeto TextBox y un botón. También requiere que se haya creado fontDialog1. Font contiene la información de tamaño pero no la información de color. private void button1_Click(object sender, System.EventArgs e) { fontDialog1.ShowColor = true; fontDialog1.Font = textBox1.Font; fontDialog1.Color = textBox1.ForeColor; if(fontDialog1.ShowDialog() != DialogResult.Cancel ) { textBox1.Font = fontDialog1.Font ; textBox1.ForeColor = fontDialog1.Color; } } c) OpenFileDialog (Clase) Solicita al usuario que abra un archivo. Esta clase no se puede heredar. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: public sealed class OpenFileDialog : FileDialog Esta clase permite comprobar si existe un archivo y abrirlo. La propiedad ShowReadOnly determina si aparece una casilla de verificación de sólo lectura en el cuadro de diálogo. La propiedad ReadOnlyChecked indica si la casilla de verificación de sólo lectura está activada. La mayor parte de la funcionalidad de esta clase se encuentra en la clase FileDialog. Si desea dar al usuario la capacidad de seleccionar una carpeta en lugar de un archivo, utilice FolderBrowserDialog en su lugar. Ejemplo: private void button1_Click(object sender, System.EventArgs e) { Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = "c:\\" ; L.I. José Raymundo Ceja Vázquez 2 Unidad I – Aplicación de controles openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; openFileDialog1.FilterIndex = 2 ; openFileDialog1.RestoreDirectory = true ; if(openFileDialog1.ShowDialog() == DialogResult.OK) { try { if ((myStream = openFileDialog1.OpenFile()) != null) { using (myStream) { // Insert code to read the stream here. } } } catch (Exception ex) { MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); } } } d) PrintDialog (Clase) Permite a los usuarios seleccionar una impresora y elegir qué secciones del documento se van a imprimir, al imprimir desde una aplicación de formularios Windows Forms. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: public sealed class PrintDialog : CommonDialog Cuando se crea una instancia de PrintDialog, se establecen las propiedades de lectura y escritura en sus valores iniciales. Para obtener una lista de esos valores, vea el constructor PrintDialog. Para obtener la configuración de impresora que el usuario ha modificado con PrintDialog, utilice la propiedad PrinterSettings. Nota: Esta clase quizá no funcione en los microprocesadores AMD64 a menos que se establezca la propiedad UseEXDialog en true. Nota: Los miembros contenidos en esta clase se utilizan al imprimir desde una aplicación de formularios Windows Forms. Si está imprimiendo desde una aplicación Windows Presentation Foundation, vea Printing Overview Ejemplo: En el ejemplo de código siguiente se muestra cómo utilizar el control PrintDialog para establecer las propiedades AllowSomePages, ShowHelp y Document. Para ejecutar este ejemplo, pegue el siguiente código en un formulario que contiene un control PrintDialog denominado PrintDialog1 y un botón denominado Button1. En este ejemplo se requiere que el evento Click del botón y el evento PrintPage de docToPrint se hayan conectado a los métodos de control de eventos definidos en este ejemplo. L.I. José Raymundo Ceja Vázquez 3 Unidad I – Aplicación de controles // Declare the PrintDocument object. private System.Drawing.Printing.PrintDocument docToPrint = new System.Drawing.Printing.PrintDocument(); // This method will set properties on the PrintDialog object and // then display the dialog. private void Button1_Click(System.Object sender, System.EventArgs e) { // Allow the user to choose the page range he or she would // like to print. PrintDialog1.AllowSomePages = true; // Show the help button. PrintDialog1.ShowHelp = true; // Set the Document property to the PrintDocument for // which the PrintPage Event has been handled. To display the // dialog, either this property or the PrinterSettings property // must be set PrintDialog1.Document = docToPrint; DialogResult result = PrintDialog1.ShowDialog(); // If the result is OK then print the document. if (result==DialogResult.OK) { docToPrint.Print(); } } // The PrintDialog will print the document // by handling the document's PrintPage event. private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // Insert code to render the page here. // This code will be called when the control is drawn. // The following code will render a simple // message on the printed document. string text = "In document_PrintPage method."; System.Drawing.Font printFont = new System.Drawing.Font ("Arial", 35, System.Drawing.FontStyle.Regular); // Draw the content. e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 10, 10); } L.I. José Raymundo Ceja Vázquez 4 Unidad I – Aplicación de controles e) PrintPreviewDialog (Clase) Representa un formulario de cuadro de diálogo que contiene PrintPreviewControl. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: [ComVisibleAttribute(true)] [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)] public class PrintPreviewDialog : Form Cuando se crea una instancia de la clase PrintPreviewDialog, se establecen algunas propiedades de lectura y escritura en sus valores iniciales. Para obtener una lista de esos valores, vea el constructor PrintPreviewDialog. En el siguiente ejemplo de código muestra el PrintPreviewDialog que establece las propiedades Document y UseAntiAlias. El ejemplo supone que el formulario contiene un TreeView denominado TreeView1 que contiene los objetos TreeNode. El valor de la propiedad Tag de cada objeto TreeNode debe establecerse en el nombre completo de un documento al que se puede obtener acceso desde el equipo en el que se ejecuta el ejemplo. Establezca el valor de cada propiedad TreeNode.Text en una cadena que identifique el archivo especificado por la propiedad TreeNode.Tag. Por ejemplo, puede establecer TreeNode1.Tag en “c:\myDocuments\recipe.doc” y TreeNode1.Text en “recipe.doc”. El ejemplo también supone que el formulario contiene un PrintPreviewDialog denominado PrintPreviewDialog1 y un botón denominado Button1. Para ejecutar este ejemplo, llame al método InitializePrintPreviewDialog en el constructor del formulario o en el controlador de eventos Load. // Declare the dialog. internal PrintPreviewDialog PrintPreviewDialog1; // Declare a PrintDocument object named document. private System.Drawing.Printing.PrintDocument document = new System.Drawing.Printing.PrintDocument(); // Initalize the dialog. private void InitializePrintPreviewDialog() { // Create a new PrintPreviewDialog using constructor. this.PrintPreviewDialog1 = new PrintPreviewDialog(); //Set the size, location, and name. this.PrintPreviewDialog1.ClientSize = new System.Drawing.Size(400, 300); this.PrintPreviewDialog1.Location = new System.Drawing.Point(29, 29); this.PrintPreviewDialog1.Name = "PrintPreviewDialog1"; // Associate the event-handling method with the // document's PrintPage event. this.document.PrintPage += new System.Drawing.Printing.PrintPageEventHandler (document_PrintPage); // Set the minimum size the dialog can be resized to. this.PrintPreviewDialog1.MinimumSize = new System.Drawing.Size(375, 250); // Set the UseAntiAlias property to true, which will allow the // operating system to smooth fonts. L.I. José Raymundo Ceja Vázquez 5 Unidad I – Aplicación de controles this.PrintPreviewDialog1.UseAntiAlias = true; } private void Button1_Click(object sender, System.EventArgs e) { if (TreeView1.SelectedNode != null) // Set the PrintDocument object's name to the selectedNode // object's tag, which in this case contains the // fully-qualified name of the document. This value will // show when the dialog reports progress. { document.DocumentName = TreeView1.SelectedNode.Tag.ToString(); } // Set the PrintPreviewDialog.Document property to // the PrintDocument object selected by the user. PrintPreviewDialog1.Document = document; // Call the ShowDialog method. This will trigger the document's // PrintPage event. PrintPreviewDialog1.ShowDialog(); } private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // Insert code to render the page here. // This code will be called when the PrintPreviewDialog.Show // method is called. // The following code will render a simple // message on the document in the dialog. string text = "In document_PrintPage method."; System.Drawing.Font printFont = new System.Drawing.Font("Arial", 35, System.Drawing.FontStyle.Regular); e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0); } f) FolderBrowserDialog (Clase) Pide al usuario que seleccione una carpeta. Esta clase no se puede heredar. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: public sealed class FolderBrowserDialog : CommonDialog Esta clase proporciona un modo de preguntar al usuario si desea examinar, crear y, posteriormente, seleccionar una carpeta. Utilice esta clase si sólo desea que el usuario seleccione carpetas, pero no archivos. Las carpetas se examinan mediante un control de árbol. Sólo se pueden seleccionar las carpetas del sistema de archivos, las carpetas virtuales no. L.I. José Raymundo Ceja Vázquez 6 Unidad I – Aplicación de controles Normalmente, después de crear un FolderBrowserDialog nuevo, RootFolder se establece en la ubicación desde donde se va a comenzar a examinar. SelectedPath puede establecerse también en una ruta de acceso absoluta a una subcarpeta de RootFolder que se seleccionará inicialmente. Otra posibilidad es establecer la propiedad Description para proporcionar instrucciones adicionales al usuario. Por último, se llama al método ShowDialog para que muestre el cuadro de diálogo al usuario. Si se cierra el cuadro de diálogo y el resultado de ShowDialog es DialogResult.OK, SelectedPath será una cadena que contenga la ruta de acceso a la carpeta seleccionada. Es posible utilizar la propiedad ShowNewFolderButton para controlar si el usuario tiene permiso para crear carpetas nuevas con el botón Nueva carpeta. FolderBrowserDialog es un cuadro de diálogo modal, por lo tanto, cuando se muestra, bloquea el resto de la aplicación hasta que el usuario elige una carpeta. Cuando un cuadro de diálogo se muestra en forma modal, no puede producirse ninguna entrada de datos (mediante teclado o haciendo clic con el mouse), a excepción de los objetos del cuadro de diálogo. El programa debe ocultar o cerrar el cuadro de diálogo (normalmente, como respuesta a alguna acción del usuario) antes de que pueda producirse una entrada de datos en el programa de llamada. El ejemplo de código siguiente crea una aplicación que le permite al usuario abrir los archivos de texto enriquecido (.rtf) dentro del control RichTextBox. // The following example displays an application that provides the ability to // open rich text files (rtf) into the RichTextBox. The example demonstrates // using the FolderBrowserDialog to set the default directory for opening files. // The OpenFileDialog class is used to open the file. using System; using System.Drawing; using System.Windows.Forms; using System.IO; public class FolderBrowserDialogExampleForm : System.Windows.Forms.Form { private FolderBrowserDialog folderBrowserDialog1; private OpenFileDialog openFileDialog1; private RichTextBox richTextBox1; private MainMenu mainMenu1; private MenuItem fileMenuItem, openMenuItem; private MenuItem folderMenuItem, closeMenuItem; private string openFileName, folderName; private bool fileOpened = false; // The main entry point for the application. static void Main() { Application.Run(new FolderBrowserDialogExampleForm()); } // Constructor. public FolderBrowserDialogExampleForm() { this.mainMenu1 = new System.Windows.Forms.MainMenu(); L.I. José Raymundo Ceja Vázquez 7 Unidad I – Aplicación de controles this.fileMenuItem = new System.Windows.Forms.MenuItem(); this.openMenuItem = new System.Windows.Forms.MenuItem(); this.folderMenuItem = new System.Windows.Forms.MenuItem(); this.closeMenuItem = new System.Windows.Forms.MenuItem(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.mainMenu1.MenuItems.Add(this.fileMenuItem); this.fileMenuItem.MenuItems.AddRange( new System.Windows.Forms.MenuItem[] {this.openMenuItem, this.closeMenuItem, this.folderMenuItem}); this.fileMenuItem.Text = "File"; this.openMenuItem.Text = "Open..."; this.openMenuItem.Click += new System.EventHandler(this.openMenuItem_Click); this.folderMenuItem.Text = "Select Directory..."; this.folderMenuItem.Click += new System.EventHandler(this.folderMenuItem_Click); this.closeMenuItem.Text = "Close"; this.closeMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click); this.closeMenuItem.Enabled = false; this.openFileDialog1.DefaultExt = "rtf"; this.openFileDialog1.Filter = "rtf files (*.rtf)|*.rtf"; // Set the help text description for the FolderBrowserDialog. this.folderBrowserDialog1.Description = "Select the directory that you want to use as the default."; // Do not allow the user to create new files via the FolderBrowserDialog. this.folderBrowserDialog1.ShowNewFolderButton = false; // Default to the My Documents folder. this.folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Personal; this.richTextBox1.AcceptsTab = true; this.richTextBox1.Location = new System.Drawing.Point(8, 8); this.richTextBox1.Size = new System.Drawing.Size(280, 344); this.richTextBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right; this.ClientSize = new System.Drawing.Size(296, 360); this.Controls.Add(this.richTextBox1); this.Menu = this.mainMenu1; this.Text = "RTF Document Browser"; } // Bring up a dialog to open a file. private void openMenuItem_Click(object sender, System.EventArgs e) { // If a file is not opened, then set the initial directory to the // FolderBrowserDialog.SelectedPath value. if (!fileOpened) { L.I. José Raymundo Ceja Vázquez 8 Unidad I – Aplicación de controles openFileDialog1.InitialDirectory = folderBrowserDialog1.SelectedPath; openFileDialog1.FileName = null; } // Display the openFile dialog. DialogResult result = openFileDialog1.ShowDialog(); // OK button was pressed. if(result == DialogResult.OK) { openFileName = openFileDialog1.FileName; try { // Output the requested file in richTextBox1. Stream s = openFileDialog1.OpenFile(); richTextBox1.LoadFile(s, RichTextBoxStreamType.RichText); s.Close(); fileOpened = true; } catch(Exception exp) { MessageBox.Show("An error occurred while attempting to load the file. The error is:" + System.Environment.NewLine + exp.ToString() + System.Environment.NewLine); fileOpened = false; } Invalidate(); closeMenuItem.Enabled = fileOpened; } // Cancel button was pressed. else if(result == DialogResult.Cancel) { return; } } // Close the current file. private void closeMenuItem_Click(object sender, System.EventArgs e) { richTextBox1.Text = ""; fileOpened = false; closeMenuItem.Enabled = false; } // Bring up a dialog to chose a folder path in which to open or save a file. private void folderMenuItem_Click(object sender, System.EventArgs e) { // Show the FolderBrowserDialog. DialogResult result = folderBrowserDialog1.ShowDialog(); if( result == DialogResult.OK ) { L.I. José Raymundo Ceja Vázquez 9 Unidad I – Aplicación de controles folderName = folderBrowserDialog1.SelectedPath; if(!fileOpened) { // No file is opened, bring up openFileDialog in selected path. openFileDialog1.InitialDirectory = folderName; openFileDialog1.FileName = null; openMenuItem.PerformClick(); } } } } g) SaveFileDialog (Clase) Pregunta al usuario si desea seleccionar una ubicación para guardar un archivo. Esta clase no se puede heredar. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) Sintaxis: public sealed class SaveFileDialog : FileDialog Esta clase permite abrir y sobrescribir un archivo existente o crear un archivo nuevo. La mayor parte de la funcionalidad de esta clase se encuentra en la clase FileDialog. Nota de la plataforma Windows Mobile 2003 para Pocket PC, Windows Mobile 2003 para Smartphone, Windows CE: En los dispositivos de Pocket PC, si no se especifica una extensión para el nombre de archivo, el control anexa la extensión del tipo seleccionado en el cuadro de diálogo. En Windows CE, el control no anexa ninguna extensión. Todas las plataformas admiten la propiedad FilterIndex que devuelve el índice del filtro de extensión seleccionado. En el ejemplo de código siguiente se muestra la forma de crear un objeto SaveFileDialog, establecer los miembros, llamar al cuadro de diálogo utilizando el método ShowDialog y guardar el archivo actual. El ejemplo requiere la existencia de un formulario con un botón. private void button1_Click(object sender, System.EventArgs e) { Stream myStream ; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; saveFileDialog1.FilterIndex = 2 ; saveFileDialog1.RestoreDirectory = true ; if(saveFileDialog1.ShowDialog() == DialogResult.OK) { if((myStream = saveFileDialog1.OpenFile()) != null) { // Code to write the stream goes here. myStream.Close(); } } } L.I. José Raymundo Ceja Vázquez 10