sábado, 29 de noviembre de 2014
ASP.NET
Usar servicios de aplicación ASP.NET
La primera parte muestra cómo configurar un sitio web ASP.NET para exponer los servicios de aplicación. La segunda parte muestra cómo compilar una aplicación de consola de Windows con acceso a la información de autenticación, rol y perfil de un usuario. En este tutorial generará una aplicación de consola de Windows, pero los servicios de la aplicación ASP.NET están disponibles para todas las aplicaciones cliente que pueden enviar y recibir mensajes en formato SOAP. La parte final describe cómo implementar el sitio web de los servicios de aplicación en Windows Server 2008 e IIS 7.0.
Requisitos previos
Visual Studio 2010. No puede usar Microsoft Visual Web Developer 2005 para este tutorial porque creará una aplicación de consola de Windows, que no se admite en Visual Web Developer Express. Microsoft SQL Server o SQL Server Express Edition instalado en el equipo.
Exponer los servicios de aplicación
Para crear el sitio web de los servicios de aplicación
Abra Visual Studio 2010. En el menú Archivo, haga clic en Nuevo sitio Web.
Aparece el cuadro de diálogo Nuevo sitio web. En Plantillas instaladas de Visual Studio, seleccione Sitio web ASP.NET. En la lista Ubicación, seleccione Sistema de archivos. En el cuadro de texto Carpeta, asigne el nombre WcfApplicationServices al sitio web. Haga clic en Aceptar.
Visual Studio crea un nuevo sitio web ASP.NET y abre la página Default.aspx. En el menú Ver, haga clic en Otras ventanas y, a continuación, haga clic en Ventana Propiedades. En el Explorador de soluciones, haga clic en el nombre del sitio web. En la ventana Propiedades, establezca Usar puertos dinámicos en False.
Esto indica a Visual Studio que especifique un puerto fijo en lugar de un puerto seleccionado de forma aleatoria cuando inicie el servidor de desarrollo de ASP.NET. En este tutorial, debe tener un número de puerto fijo que pueda usar al generar las clases de proxy de cliente y los archivos de configuración. Para obtener más información, vea Cómo: Especificar un puerto para el servidor de desarrollo.
Establezca el Número de puerto en 8080.
Proveedores de Datos en ADO.NET
Los proveedores de acceso a datos ADO.NET (conocidos como "Managed Data Providers") representa un conjunto especifico de clases que permiten conectarse e interactuar con una base de datos, cada uno utilizando un protocolo particular. El .NET Framework incluye cuatro proveedores de acceso a datos que en conjunto le permiten conectarse e interactuar virtualmente con cualquier base de datos existente en la actualidad: | |
ADO.NET
Polimorfismo en Visual Basic
Cómo proporciona Visual Basic el polimorfismo
La mayoría de los sistemas de programación orientada a objetos proporcionan polimorfismo mediante la herencia. Es decir, las hipotéticas clases Pulga y Tiranosaurio pueden heredar características de una clase Animal. Cada clase invalidaría el método Morder de la clase Animal para aportar sus propias características de mordedura.El polimorfismo proviene del hecho de que puede llamar al método Morder de un objeto que pertenezca a cualquier clase derivada de Animal sin conocer la clase a la que pertenece el objeto.
Proporcionar polimorfismo mediante interfaces
Visual Basic no utiliza la herencia para proporcionar polimorfismo. Visual Basic proporciona el polimorfismo mediante múltiples interfaces ActiveX. En el Modelo de objetos componentes (COM) que forma la infraestructura de la especificación ActiveX, las múltiples interfaces permiten que los sistemas de componentes software evolucionen sin afectar al código existente.Una interfaz es un conjunto de propiedades y métodos relacionados. Gran parte de la especificación ActiveX se ocupa de la implementación de interfaces estándar para obtener servicios del sistema o para proporcionar funcionalidad a otros programas.
En Visual Basic podría crear una interfaz Animal e implementarla en las clases Pulga y Tiranosaurio. Después podría invocar el método Morder de cualquiera de los dos tipos de objeto sin conocer su tipo.
Polimorfismo y rendimiento
El polimorfismo es importante por razones de rendimiento. Para comprobarlo, observe la función siguientePublic Sub Alimentarse(ByVal Critter As Object, _ ByVal Food As Object) Dim dblDistance As Double ' Código para calcular la distancia a la comida '(omitido). Critter.Mover dblDistance ' Enlace en tiempo de ' compilación Critter.Morder Food ' Enlace en tiempo de ' compilación End Sub
Los métodos Mover y Morder son enlaces en tiempo de compilación con Critter. El enlace en tiempo de compilación tiene lugar cuando Visual Basic no puede determinar en tiempo de compilación el tipo de objeto que contendrá una variable. En este ejemplo, el argumento Critter está declarado como As Object, de forma que en tiempo de ejecución pueda contener una referencia a cualquier tipo de objeto, como un Coche o una Roca.
Como no puede saber cuál será el objeto, Visual Basic compila una parte de código adicional para preguntar al objeto si acepta el método llamado. Si el objeto acepta el método, dicho código adicional lo invoca; si no, el código adicional desencadena un error. Todas las llamadas a métodos o a propiedades incurren en esta carga adicional.
Por el contrario, las interfaces permiten los enlaces en tiempo de diseño. Cuando Visual Basic conoce en tiempo de compilación la interfaz que se va a llamar, puede comprobar en la biblioteca de tipos si dicha interfaz acepta el método. Después, Visual Basic puede compilar un salto directo al método, mediante una tabla virtual de funciones (vtable). Esto es muchas veces más rápido que el enlace en tiempo de compilación.
Ahora suponga que los métodos Mover y Morder pertenecen a la interfaz Animal y que todas las clases de animales implementan esta interfaz. Ahora podría declarar el argumento Critter como As Animal y los métodos Mover y Morder se enlazarán en tiempo de diseño:
Public Sub Alimentarse(ByVal Critter As Animal, _ ByVal Food As Object) Dim dblDistance As Double ' Código para calcular la distancia a la comida '(omitido). Critter.Mover dblDistance ' Enlace en tiempo de ' diseño. Critter.Morder Food ' Enlace en tiempo de ' diseño. End Sub
Definiendo Propiedades e Implementando Métodos
Crear una aplicación que contiene una clase de Visual Basic .NET
- Inicie Visual Studio .NET y cree un nuevo proyecto de aplicación de consola de Visual Basic .NET llamado EmployeeProperties.
- En el menú Proyecto, haga clic en Agregar clase. En el cuadro de diálogo Agregar nuevo elemento, escriba Employee.vb en el cuadro Nombre y, a continuación, haga clic en Abrir.
- Examine el código de la nueva clase en la ventana Ver código.
Definir campos, constructores y métodos
- Agregue tres campos Private a la clase Employee de la manera siguiente:
Private Name As String Private Salary As Decimal Private HireDate As DateTime
- Defina un constructor para la clase con el fin de inicializar los campos de la clase Employee:
Public Sub New(ByVal Name As String, _ ByVal Salary As Decimal, _ ByVal HireDate As DateTime) Me.Name = Name Me.Salary = Salary Me.HireDate = HireDate End Sub
- Agregue un método Public a la clase:
Public Sub PayRise(ByVal Amount As Decimal) Me.Salary += Amount End Sub
Definir propiedades en la clase
- Agregue el código siguiente para agregar una propiedad de lectura y escritura llamada FullName. El descriptor de acceso Get devuelve el nombre del empleado. El descriptor de acceso Set utiliza el parámetro Value que se pasa en el descriptor de acceso Set para establecer el nombre del empleado.
Public Property FullName() As String Get Return Me.Name End Get Set(ByVal Value As String) Me.Name = Value End Set End Property
- Agregue el código siguiente para agregar una propiedad ReadOnly llamada Remuneration. El descriptor de acceso Get devuelve el sueldo del empleado. No hay ningún descriptor de acceso Set porque el sueldo no se puede establecer directamente; la única forma de cambiar el sueldo es llamar al método PayRise.
Public ReadOnly Property Remuneration() As Decimal Get Return Me.Salary End Get End Property
- Agregue el código siguiente para agregar otra propiedad ReadOnly llamada DaysSinceJoined. El descriptor de acceso Get calcula cuántos días ha trabajado el empleado para la compañía.
Public ReadOnly Property DaysSinceJoined() As Integer Get Dim timespan As TimeSpan = DateTime.Now.Subtract(Me.HireDate) return timespan.Days End Get End Property
Crear un objeto y utilizar las propiedades
- Muestre el código de Module1.vb en la ventana Ver código.
- En el método Main, utilice el operador New para crear un objeto Employee. Asigne la referencia de objeto a una variable local Employee del siguiente modo:
Dim worker As New Employee( "Jayne Doe", _ 125000, _ New DateTime(1998, 7, 31) )
- Agregue el código siguiente para cambiar la propiedad FullName del empleado. Esto invocará implícitamente el descriptor de acceso Set para la propiedad FullName.
worker.FullName = "Jayne Lafayette"
- Agregue el código siguiente para mostrar los detalles del empleado mediante los descriptores de acceso Get para las propiedades FullName, Remuneration y DaysSinceJoined:
Console.WriteLine("Nombre completo: " & worker.FullName) Console.WriteLine("Remuneración: " & worker.Remuneration) Console.WriteLine("Días trabajados: " & worker.DaysSinceJoined)
Comprobar que funciona
- Genere y ejecute la aplicación.
- La aplicación mostrará la siguiente información en la consola (el valor "Días trabajados" depende de la fecha actual):
Nombre completo: Jayne Lafayette Remuneración: 125000 Días trabajados: 1139
- Vuelva al archivo Module1.vb en la ventana Ver código y agregue el código siguiente al final del método Main:
worker.Remuneration = 1000000
- Pruebe a generar la aplicación. Aparecerá un error de compilación porque Remuneration es una propiedad de sólo lectura.
- Cambie la instrucción de la manera siguiente:
worker.Salary = 1000000
- Pruebe a generar de nuevo la aplicación. Aparecerá otro error de compilación porque el campo Salary está marcado como Private. La única forma de modificar el sueldo del empleado es utilizar el método público PayRise.
NameSpaces
System.Data.SqlClient
El espacio de nombres System.Data.SqlClient es el proveedor de datos de .NET Framework para SQL Server.
Un proveedor de datos de .NET Framework para SQL Server describe una colección de clases utilizada para tener acceso a una base de datos de SQL Server en el espacio administrado. Al utilizar SqlDataAdapter, se puede rellenar un DataSet residente en memoria, que sirve para consultar y actualizar la base de datos.
El espacio de nombres System.Data.SqlClient es el proveedor de datos de .NET Framework para SQL Server.
Un proveedor de datos de .NET Framework para SQL Server describe una colección de clases utilizada para tener acceso a una base de datos de SQL Server en el espacio administrado. Al utilizar SqlDataAdapter, se puede rellenar un DataSet residente en memoria, que sirve para consultar y actualizar la base de datos.
Módulos de Clase en Visual Basic
La diferencia principal entre clases y módulos consiste en que pueden crearse instancias de clases como objetos pero no de módulos. Como sólo existe una copia de los datos de un módulo estándar, cuando una parte del programa cambia una variable pública en un módulo estándar, cualquier otra parte del programa obtendrá el mismo valor si lee luego esa variable. En comparación, los datos de objeto existen individualmente para cada objeto con instancias. Otra distinción es que, a diferencia de los módulos estándar, las clases pueden implementar interfaces.
Las clases y los módulos también emplean ámbitos diferentes para sus miembros. Los miembros definidos dentro de una clase tienen el ámbito de una instancia específica de la clase y sólo existen mientras dure el objeto. Para tener acceso a los miembros de clases desde el exterior de una clase, debe utilizar los nombres completos con el formato Objeto.Miembro.
Por otro lado, los miembros declarados dentro de un módulo son de manera predeterminada accesibles públicamente y se puede obtener acceso a ellos mediante cualquier código que tenga acceso al módulo. Esto significa que las variables en un módulo estándar son de hecho variables globales porque son visibles desde cualquier parte del proyecto y existen durante toda la vida útil del programa.
Cuando el modificador Shared se aplica a un miembro de clase, está asociado con la propia clase en lugar de con una instancia determinada de la clase. Se tiene acceso directo al miembro mediante el nombre de clase, de la misma manera que se tiene acceso a los miembros de módulos. Para obtener más información acerca de miembros compartidos, consulte Miembros compartidos en Visual Basic. |
Por otro lado, los miembros declarados dentro de un módulo son de manera predeterminada accesibles públicamente y se puede obtener acceso a ellos mediante cualquier código que tenga acceso al módulo. Esto significa que las variables en un módulo estándar son de hecho variables globales porque son visibles desde cualquier parte del proyecto y existen durante toda la vida útil del programa.
Manejo de Excepciones en Visual Basic.net
Control estructurado de excepciones
En el control estructurado de excepciones, los bloques de código se encapsulan y cada uno de ellos tiene uno o varios controladores asociados. Cada controlador especifica una forma de condición de filtro para el tipo de excepción que controla. Cuando el código de un bloque protegido genera una excepción, se busca por orden en el conjunto de controladores correspondientes y se ejecuta el primero que contenga una condición de filtro coincidente. Un método puede tener varios bloques de control estructurado de excepciones y dichos bloques pueden además estar anidados.
La instrucción Try...Catch...Finally se utiliza específicamente para el control estructurado de excepciones.
Aquí en este manualillo solo se explicará este método, el control estructurado de excepciones.
Visual Basic admite el control estructurado de excepciones, que facilita la tarea de crear y mantener programas mediante controladores de errores consistentes y exhaustivos. El control estructurado de excepciones es un código diseñado para detectar y dar respuesta a los errores que se producen durante la ejecución, mediante la combinación de una estructura de control (similar a Select Case o While) con excepciones, bloques de código protegidos y filtros.
El uso de la instrucción Try…Catch…Finally permite proteger bloques de código con posibilidades de generar errores. Los controladores de excepciones pueden anidarse, y las variables que se declaren en cada bloque tendrán un ámbito local.
Try
‘El código que puede producir el error
Catch [filtros opcionales o tipos de errores a capturar]
‘Código para cuando se produzca un error
[bloques catch adicionales]
Finally
‘Código para cuando aparezca o no un error
End Try
El bloque Try de un controlador de excepción Try...Catch...Finally contiene la sección del código que el controlador de errores va a supervisar. Si se produce un error durante la ejecución de cualquier parte del código de esta sección, Visual Basic examinará cada instrucción Catch de Try...Catch...Finally hasta que encuentre una cuya condición coincida con el error. Si la encuentra, el control se transferirá a la primera línea de código del bloque Catch. Si no se encuentra una instrucción Catch coincidente, la búsqueda continuará en las instrucciones Catch del bloque Try...Catch...Finally exterior que contiene el bloque en el que ocurrió la excepción. Este proceso se prolongará a lo largo de toda la pila hasta que se encuentre un bloque Catch coincidente en el procedimiento actual. De no encontrarse, se produciría un error.
El código de la sección Finally siempre se ejecuta en último lugar, inmediatamente antes que el bloque de control de errores pierda su ámbito, con independencia de que se ejecute el código de los bloques Catch. Sitúe el código de limpieza (el código que cierra los archivos y libera los objetos, por ejemplo) en la sección Finally.
Filtrar errores en el bloque Catch
Los bloques Catch ofrecen tres opciones para filtrar errores específicos. En una de ellas, los errores se filtran basándose en la clase de la excepción (en este caso ClassLoadException), como se muestra en el siguiente código:
Try
' "Try" block.
Catch e as ClassLoadException
' "Catch" block.
Finally
' "Finally" block.
End Try
Si se produce un error ClassLoadException, se ejecuta el código del bloque Catch especificado.
En la segunda opción para filtrar errores, la sección Catch puede filtrar cualquier expresión condicional. Un uso común de este formato del filtro Catch consiste en comprobar números de error específicos, como se muestra en el código siguiente:
Try
' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
' "Catch" block.
Finally
' "Finally" block.
End Try
Cuando Visual Basic encuentra el controlador de errores coincidente, ejecuta el código de este controlador y pasa el control al bloque Finally.
Nota Al buscar un bloque Catch que controle una excepción, se evalúa el controlador de cada bloque hasta encontrar uno que coincida. Puesto que estos controladores pueden ser llamadas a funciones, es posible que se produzcan efectos secundarios no esperados; por ejemplo, una llamada de este tipo puede cambiar una variable pública y provocar que ésta se utilice en el código de un bloque Catch distinto que termina controlando la excepción.
La tercera alternativa, consiste en combinar las primeras dos opciones y utilizar ambas para el control de excepciones.
El bloque Finally siempre se ejecuta, con independencia de cualquier otra acción que tenga lugar en los bloques Catch anteriores. No puede utilizar Resume o Resume Next en el control estructurado de excepciones.
Ahora se realizarán una serie de ejemplos que aclararán lo expuesto
Ejemplo 1.
Module Module1
Sub Main ()
Dim sValor As String
Dim iNumero As Integer
Try
'Aqui comienza el control de errores
Console.WriteLine("Introducir un número")
sValor = Console.ReadLine
'Si no hemos introducido ningún número
iNumero = sValor 'aquí se producira un error
Catch
'Si se produce un error, se generará una excepción
'que capturamos en este bloque de código
'manipulador de excepción, definido por Catch
Console.WriteLine("Error al introducir el número" & ControlChars.CrLf & "el valor {0} es incorrecto", sValor)
End Try
Console.Read()
End Sub
End Module
Esta y las siguientes 2 líneas no pertenecen al código anterior
Observen que antes de module1 no están declaradas Option Explicit On o
Option Strict On.
Tipos de Errores en Visual Basic
En Visual Basic, los errores (también denominados excepciones) se dividen en tres categorías: errores de sintaxis, errores en tiempo de ejecución y errores lógicos.
Errores de sintaxis
Errores en tiempo de ejecución
Errores lógicos
Controles en Visual Basic
En Visual Basic existen tres categorías generales de controles: Controles intrínsecos, Controles ActiveX, Objetos insertables
Estos controles se encuentran dentro del archivo ejecutable de Visual Basic. Los controles intrínsecos están siempre incluidos en el cuadro de herramientas, no como los controles Activex, que se pueden quitar o agregar al cuadro de herramientas. A continuación una lista de controles intrínsecos.
Nombre de control | Nombre de clase | Descripción |
Casilla de verificación | CheckBox | Presenta una opción de tipoVerdadero o Falso. |
Cuadro combinado | ComboBox | Cambina un cuadro de texto y un cuadro de lista. |
Botón de comando | CommandButton | Ejecuta un comando o una acción cuando el usuario hace clic en él. |
Datos | Data | Permite conectar una base de datos existente y presentar información en ella en los formularios. |
Cuadro de lista de directorios | DirListBox | Presenta directorios y rutas de acceso. |
Cuadro de lista de archivos | FileListBox | Presenta una lista de archivos. |
Cuadro de lista de unidades | DriveListBox | Presenta una lista de unidades de disco validas. |
Marco | Frame | Proporciona un contenedor visual y funcional para los controles. |
Barras de desplazamiento horizontal y vertical | HScrollBar y VScrollBar | Permite que un usuario agregue barras de desplazamiento a controles que no las tienen de forma automática. |
Imagen | Image | Presenta mapas de bits, iconos o metarchivos de Windows, archivos JPEG o GIF, y actúa como un botón de comando cuando se hace clic en él. |
Etiqueta | Label | Presenta texto con el cual el usuario no puede interactuar ni modificar. |
Línea | Line | Agrega un segmento de línea recta a un formulario. |
Cuadro de lista | ListBox | Presenta una lista de elementos entre los que el usuario puede elegir. |
Contenedor OLE | OLE | Incrusta datos en una aplicación de Visual Basic. |
Botón de opción | OptionButton | El control OptionButton, como parte de un grupo de opciones con otros botones de opción. Presenta varias opciones entre las ue el usuario sólo puede elegir una. |
Cuadro de imágen | Picturebox | Presenta mapas de bits, íconos o metarchivos de Windows y otros tipos de archivos graficos compatibles. También presenta texto o actúa como contenedor visual para otros controles.. |
Forma | Shape | Agrega un rectángulo, un cuadrado, una elipse o un circulo a un formulario, marco o cuadro de imagen. |
Cuadro de texto | TextBox | Proporciona una área para escribir o presentar texto. |
Cronómetro | Timer | Ejecuta eventos periódicos a intervalos de tiempo específicado. |
Son aquellos controles que existen como archivos independientes con extensión nombre de archivo .ocx. Entre éstos se incluyen los controles disponibles en todas las ediciones de Visual Basic (controles cuadrícula, cuadro combinado y lista enlazados a datos y varios más) y los que sólo están disponibles en la Edición Profesional y la Edición Empresarial (como Listview, Toolbar, Animation y Tabbed Dialog). A estos también se suman los controles Activex de otros fabricantes.
Nombre de control | Nombre de clase | Descripción |
Control de datos ADO | ADODC | Crea una conexión a una base de datos de datos mediane ADO. Asignable a la propiedad DataSource de otros controles, como el control DataGrid. |
Dialogo común | CommonDialog | Proporciona un conjunto de cuadros de diálogo estándar para operaciones como abrir y guardar archivos, establecer opciones de impresión y seleccionar colores y fuentes. |
Cuadro combinado enlazado a datos | DataGrid | Proporciona las mayorías de las opciones del control ComboBox estándar, así como mayor capacidad de acceso a datos. |
Cuadrícula Apex enlazada a datos | DataGrid | Control con apariencia de una hoja de cálculo vinculado aun origén de datos como un control de datos ADO. Es posible la lectura y la modificación del recordset. |
Cuadro de lista enlazado a datos. | DataList | Proporciona la mayoría de de las características del control ListBox estándar, asi como mayor capacidad de acceso a datos. |
FlexGrid de Microsoft | MSFlexGrid | Control con apariencia de hoja de cálculo de sólo lectura que se puede vincular al diseñador de entorno de datos para mostrar recordset jerárquicos |
Convenciones de nomenclatura de los controles
Cuando crea un objeto (un formulario o un control) por primera vez, Visual Basic establece su propiedad Name a un valor predeterminado. Por ejemplo, todos los botones de comando tienen la propiedad Name establecida inicialmente a Commandn, donde n es 1, 2, 3 y así sucesivamente. Visual Basci llama al primer botón de comando de un formulario Command1, al segundo Command2 y al tercero Command3.
Puede mantener los nombres predeterminados; sin embargo, cuando tiene varios controles del mismo tipo, es más lógico modificar las propiedades Name para que sean algo más descriptivas. Como puede ser dificil distinguir entre el botón Command1 de miForm y el botón Command1 de SubForm, la convención de nomenclatura es recomendable, especialmente cuando una aplicación se compone de varios módulos de formulario, módulos estándar y módulos de clase.
Puede usar un prefijo para describir la clase, seguido de un nombre descriptivo del control. El uso de convención de nombres hace que el código sea más autodescriptivo y agrupa objetos similares alfabéticamente en el cuadro de lista Objeto. Por ejemplo:
chkSoloLecturaLos nombres de los formularios y los controles:
- Deben empezar por una letra
- Sólo deben contener letras, números y el carácter de subrayado (_); no se permiten signos de puntuación ni espacios en blanco.
- No pueden tener una longitud mayor de 40 caracteres.
Todos los controles tienen una propiedad que se puede usar para almacenar u obtener valores mediante una referencia al control, sin mencionar el nombre de la propiedad.
Este se denomina valor del control y normalmente es la propiedad más importante o la más frecuentemente utilizada del control.
Cuando quiera hacer una referencia a la propiedad de un control que es el valor de dicho control, puede hacerlo sin especificar el nombre de la propiedad. Por ejemplo, esta línea de código establece la propiedad Text de un cuadro de texto.
Text1 = "Este texto se asigna a la propiedad Text de Text1"En este ejemplo, la propiedad Caption de Label1 se establece a la propiedad FileName de File1 cuando el usuario hace clic en un archivo del cuadro de lista de archivos:
En la tabla siguiente se enumeran las propiedades consideradas como valor de control.Private File1_Click() Label1 = File1 End Sub
Control | Valor |
CheckBox | Value |
ComboBox | Text |
CommandButton | Value |
CommonDialog | Action |
Data | Caption |
DataCombo | Text |
DataGrid | Text |
DataList | Text |
DirListBox | Path |
DriveListBox | Drive |
FileListBox | FileName |
FlexGrid | Text |
Frame | Caption |
HScrollBar | Value |
Image | Picture |
Label | Caption |
Line | Visible |
ListBox | Text |
OptionButton | Value |
PictureBox | Picture |
Shape | Shape |
TextBox | Text |
Timer | Enabled |
VScrollBar | Value |
Como Agregar Controles a Formularios de Windows Form
Para dibujar un control en un formulario
Abra el formulario. Para obtener más información, vea Cómo: Mostrar formularios Windows Forms en el diseñador. En el Cuadro de herramientas, haga clic en el control que desee agregar al formulario. En el formulario, haga clic en el punto en que desee que se encuentre la esquina superior izquierda del control y arrastre hasta donde desee que se encuentre la esquina inferior derecha del control.
El control se agregará al formulario con la ubicación y el tamaño especificados.
Nota
Cada control tiene definido un tamaño predeterminado. Puede agregar un control al formulario con su tamaño predeterminado arrastrándolo desde el Cuadro de herramientas al formulario.
Para agregar un control a un formulario
Abra el formulario. Para obtener más información, vea Cómo: Mostrar formularios Windows Forms en el diseñador. En el Cuadro de herramientas, haga clic en el control que desee y arrástrelo al formulario.
El control se agregará al formulario en la ubicación especificada, con su tamaño predeterminado. En el método que controla el evento Click del botón dentro de la clase del formulario, inserte código similar al siguiente para agregar una referencia a la variable de control, establecer el valor de Location para el control y agregar el control:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim MyText As New TextBox() MyText.Location = New Point(25, 25) Me.Controls.Add(MyText) End Sub
Para agregar un control a un formulario mediante programación
Windows Form VB.NET
Como Crear un Formulario MDI
Para crear formularios MDI secundarios
Cree un formulario primario MDI con una estructura de menús que contenga los elementos de menú Archivo y Ventana de nivel superior y los elementos de menú Nuevo y Cerrar. Para obtener más información, vea Cómo: Crear formularios principales MDI. En la lista desplegable que se encuentra en la parte superior de la ventana Propiedades, seleccione el elemento de menú correspondiente al elemento Ventana y establezca el valor de la propiedad MdiList en true.
Esto habilitará al menú Ventana para que mantenga una lista de ventanas secundarias MDI abiertas, con una marca de verificación junto a la ventana secundaria activa. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto, haga clic en Agregar y seleccione Agregar nuevo elemento.
Este formulario será la plantilla de los formularios MDI secundarios.
Nota
El formulario secundario MDI que creará en este paso es un Windows Form estándar. Por tanto, tendrá una propiedad Opacity, que permite controlar la transparencia del formulario. Sin embargo, la propiedad Opacity está diseñada para ventanas de alto nivel. No la utilice con formularios MDI secundarios, porque pueden surgir problemas. En el cuadro de diálogo Agregar nuevo elemento, seleccione Windows Form (en Visual Basic o Visual C#) o Aplicación de Windows Forms (.NET) (en Visual C++) desde el panel Plantillas. En el cuadro Nombre, asigne al formulario el nombre Form2. Haga clic en el botón Abrir para agregar el formulario al proyecto.
Se abrirá el Diseñador de Windows Forms, donde se mostrará el formulario Form2. En el Cuadro de herramientas, arrastre un control RichTextBox al formulario. En la ventana Propiedades, establezca la propiedad Anchor en Top, Left y la propiedad Dock en Fill.
Esto hace que el control RichTextBox llene por completo el área del formulario MDI secundario, aunque se cambie el tamaño del formulario. Cree un controlador de eventos Click para el elemento de menú Nuevo. Para obtener información sobre cómo crear controladores de eventos, vea Cómo: Crear controladores de eventos con el diseñador. Inserte el código siguiente para crear un nuevo formulario MDI secundario cuando el usuario haga clic en el elemento de menú Nuevo.
Nota
En el ejemplo siguiente, el controlador de eventos controla el evento Click para MenuItem2. Tenga presente que, en función de las características específicas de la arquitectura de la aplicación, podría ser que el elemento de menú Nuevo no fuese MenuItem2. Protected Sub MDIChildNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click Dim NewMDIChild As New Form2() 'Set the Parent Form of the Child window. NewMDIChild.MdiParent = Me 'Display the new form. NewMDIChild.Show() End Sub
Presione F5 para ejecutar la aplicación. Observe que al seleccionar Nuevo en el menú Archivo, puede crear nuevos formularios MDI secundarios de los que se hará un seguimiento en el menú Ventana.
Suscribirse a:
Entradas (Atom)