<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>solo VB.NET - Visual Basic .Net &#187; Ejemplos</title>
	<atom:link href="http://www.solovb.net/index.php/category/ejemplos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.solovb.net</link>
	<description>Visual Basic.NET, VB.NET, Programación, Tutoriales, Ejemplos</description>
	<lastBuildDate>Mon, 02 Jan 2012 14:30:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>TabControl &#8211; Seleccionar Pagina por c&#243;digo</title>
		<link>http://www.solovb.net/index.php/2011/05/02/tabcontrol-seleccionar-pagina-por-cdigo-2/</link>
		<comments>http://www.solovb.net/index.php/2011/05/02/tabcontrol-seleccionar-pagina-por-cdigo-2/#comments</comments>
		<pubDate>Mon, 02 May 2011 19:28:30 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[SelectIndex]]></category>
		<category><![CDATA[TabControl]]></category>
		<category><![CDATA[TabPage]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2011/05/02/tabcontrol-seleccionar-pagina-por-cdigo-2/</guid>
		<description><![CDATA[Solovb es un sitio que se caracteriza por sus ejemplos simples y sencillos. Hoy un ejemplo del uso de TabControl. En más de una oportunidad tuve la necesidad de seleccionar mediante código que pagina (TabPage) del control debería ser la que se mostrara, la solución es sencilla pero quizas la estes necesitando en este momento [...]]]></description>
			<content:encoded><![CDATA[<p>Solovb es un sitio que se caracteriza por sus ejemplos simples y sencillos. Hoy un ejemplo del uso de TabControl.</p>
<p>En más de una oportunidad tuve la necesidad de seleccionar mediante código que pagina (TabPage) del control debería ser la que se mostrara, la solución es sencilla pero quizas la estes necesitando en este momento y aquí te la dejo.</p>
<p>Primero necesitaremos un formulario windows, un TabControl y algunos botones dispuestos de forma similar a lo que se ve en la siguiente imagen:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2011/05/TabControl001.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="TabControl001" border="0" alt="TabControl001" src="http://www.solovb.net/wp-content/uploads/2011/05/TabControl001_thumb.jpg" width="550" height="380" /></a> </p>
<p>Y ahora en el evento click de cada botón debemos ingresar el siguiente codigo</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">    Private Sub btnTab1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTab1.Click
        TabControl1.SelectedIndex = 0
    End Sub

    Private Sub btnTab2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTab2.Click
        TabControl1.SelectedIndex = 1
    End Sub

    Private Sub btnTab3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTab3.Click
        TabControl1.SelectedIndex = 2
    End Sub

    Private Sub btnTab4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTab4.Click
        TabControl1.SelectedIndex = 3
    End Sub</pre>
<p>Y eso es todo, solo queda ejecutar, probar e implementar donde quieran. Espero que les sirva.</p>
<p>Al ejecutar se verá mas o menos así:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2011/05/TabControl002.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="TabControl002" border="0" alt="TabControl002" src="http://www.solovb.net/wp-content/uploads/2011/05/TabControl002_thumb.jpg" width="498" height="281" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2011/05/02/tabcontrol-seleccionar-pagina-por-cdigo-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Trabajando con Fechas</title>
		<link>http://www.solovb.net/index.php/2011/02/07/trabajando-con-fechas/</link>
		<comments>http://www.solovb.net/index.php/2011/02/07/trabajando-con-fechas/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 18:56:59 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Funciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[datetime]]></category>
		<category><![CDATA[Fecha]]></category>
		<category><![CDATA[fechas]]></category>
		<category><![CDATA[month]]></category>
		<category><![CDATA[now]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[year]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2011/02/07/trabajando-con-fechas/</guid>
		<description><![CDATA[Hoy quiero comentarle algunas cositas referentes al trabajo con fechas, esas cosas que uno dice… “Pero eso todo el mundo lo sabe…”, pero como este sitio no está dedicado a expertos sino a ayudar a quienes se inician en este mundo de la programación en visual basic .net, me parece mas que apropiado hablar sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy quiero comentarle algunas cositas referentes al <strong>trabajo con fechas</strong>, esas cosas que uno dice… “Pero eso todo el mundo lo sabe…”, pero como este sitio no está <strong>dedicado</strong> a <strong>expertos</strong> sino a ayudar a <strong>quienes se inician en este mundo de la programación en</strong> <strong>visual basic .net</strong>, me parece mas que apropiado hablar sobre fechas.</p>
<p>Antes de comenzar acá les dejo algunas definiciones que sería bueno conocer:</p>
<h4>DateSerial</h4>
<p>Devuelve un valor <b>Date</b> que representa un año, mes y día específicos, con la información de la hora establecida en medianoche (00:00:00).</p>
<h4>Datetime.Now</h4>
<p>Obtiene un objeto <strong>DateTime</strong> que se establece en la fecha y hora actual de este equipo, expresada como hora local.</p>
<h4>DateAdd</h4>
<p>Devuelve un valor de tipo <b>Date</b> que contiene un valor de fecha y hora al que se ha agregado un intervalo de tiempo especificado.</p>
<p>Bueno, sin más rodeos pasemos a los ejemplos. En esta oportunidad de trata de un formulario con una serie de botones y cajas de texto que nos van a informar distintas fecha como por ejemplo, el <strong>último día del mes</strong> actual o el <strong>primer día hábil </strong>de un mes, etc. Es muy sencillo y el ejemplo creo que es lo suficientemente claro por lo que no voy a explicarlo. Simplemente presten atención al <strong>código</strong> y podrán encontrar respuesta a muchas de las dudas que se generan al <strong>trabajar con fechas</strong>.</p>
<p>Este es el formulario que usaremos para el ejemplo:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2011/02/conFechas1.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Fechas en vb.net" border="0" alt="Fechas en vb.net" src="http://www.solovb.net/wp-content/uploads/2011/02/conFechas1_thumb.jpg" width="339" height="309" /></a> </p>
<p>y el código es el siguiente:</p>
<div class="notranslate">
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Fecha Actual
        MsgBox(Now.Date, MsgBoxStyle.OkOnly, &quot;Fecha Actual&quot;)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        'Fecha y Hora Actual
        MsgBox(Now(), MsgBoxStyle.OkOnly, &quot;Fecha y Hora Actual&quot;)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        'Primer Día del Mes
        MsgBox(DateSerial(Now.Year, Now.Month, 1), MsgBoxStyle.OkOnly, &quot;Primer Día del Mes&quot;)
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        'Ultimo día del Mes
        Dim fecha1 As Date = DateAdd(DateInterval.Month, 1, Now.Date)
        MsgBox(DateAdd(DateInterval.Day, -1, DateSerial(fecha1.Year, fecha1.Month, 1)), MsgBoxStyle.OkOnly, &quot;Ultimo día del Mes&quot;)
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        'Primer Día Hábil
        Dim primerDiaHabil As Date = DateSerial(Now.Year, Now.Month, 1)
        Select Case primerDiaHabil.Date.DayOfWeek
            Case 1 'Domingo
                primerDiaHabil = DateAdd(DateInterval.Day, 1, primerDiaHabil)
            Case 6 'Sabado
                primerDiaHabil = DateAdd(DateInterval.Day, 2, primerDiaHabil)
            Case Else 'De lunes a Viernes
                ' no hace nada
        End Select
        MsgBox(primerDiaHabil, MsgBoxStyle.OkOnly, &quot;Primer Día Hábil&quot;)
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        'Sumar n Dias a Hoy
        MsgBox(DateAdd(DateInterval.Day, CType(TextBox1.Text, Integer), Now.Date), MsgBoxStyle.OkOnly, &quot;Sumar n Dias a Hoy&quot;)
    End Sub

    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
        'Sumar n Meses a Hoy
        MsgBox(DateAdd(DateInterval.Month, CType(TextBox2.Text, Integer), Now.Date), MsgBoxStyle.OkOnly, &quot;Sumar n Meses a Hoy&quot;)
    End Sub</pre>
</div>
<p>Suerte y espero que les sea de mucha utilidad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2011/02/07/trabajando-con-fechas/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ordenando DataGridView</title>
		<link>http://www.solovb.net/index.php/2010/11/17/ordenando-datagridview/</link>
		<comments>http://www.solovb.net/index.php/2010/11/17/ordenando-datagridview/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 04:02:49 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[ColumnHeaderMouseClick]]></category>
		<category><![CDATA[DataGridView]]></category>
		<category><![CDATA[Ordenar]]></category>
		<category><![CDATA[Sort]]></category>
		<category><![CDATA[SortMode]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2010/11/17/ordenando-datagridview/</guid>
		<description><![CDATA[Las columnas del datagridview tienen, por defecto, la funcionalidad de ordenar los registros de forma automática simplemente haciendo clic en el encabezado de la columna que contiene el dato por el cual deseamos ordenar los datos. Cada columna del datagridview tiene una propiedad SortMode la cual podemos setear en NoSortable, Automatic o Programmatic. Si nunca [...]]]></description>
			<content:encoded><![CDATA[<p>Las columnas del <strong>datagridview</strong> tienen, por defecto, la funcionalidad de ordenar los registros de forma automática simplemente haciendo clic en el encabezado de la columna que contiene el dato por el cual deseamos ordenar los datos.</p>
<p>Cada columna del <strong>datagridview</strong> tiene una propiedad <strong>SortMode</strong> la cual podemos <strong>setear</strong> en <strong>NoSortable</strong>, <strong>Automatic</strong> o <strong>Programmatic</strong>. Si nunca cambiamos esta propiedad, estará en Automatic.</p>
<p>El orden funciona de maravilla salvo que queramos ordenar por una columna numérica. Los datos numéricos se ordenan como texto por lo que ese orden no será correcto. A continuación mostraré un ejemplo para que se pueda comprender mejor.</p>
<p>Para el ejemplo necesitamos un formulario y un control datagridview. Agregaremos tres columnas llamadas Nombre, Grupo y Puntuación. Debería verse algo similar a la siguiente imagen:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview001.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="OrdenandoDatagridview001" border="0" alt="OrdenandoDatagridview001" src="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview001_thumb.jpg" width="609" height="400" /></a> </p>
</p>
<p>A continuación agregaremos este código en el Load del formulario para agregar algunos registros:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    DataGridView1.Rows.Add(New String() {&quot;Eliseo&quot;, &quot;Usuario&quot;, 24321})
    DataGridView1.Rows.Add(New String() {&quot;Carlos&quot;, &quot;Soporte&quot;, 122})
    DataGridView1.Rows.Add(New String() {&quot;Jose&quot;, &quot;Usuario&quot;, 423})
    DataGridView1.Rows.Add(New String() {&quot;Sebastian&quot;, &quot;Supervisor&quot;, 1023})
    DataGridView1.Rows.Add(New String() {&quot;Javier&quot;, &quot;Usuario&quot;, 111})
    DataGridView1.Rows.Add(New String() {&quot;Susana&quot;, &quot;Usuario&quot;, 1})
    DataGridView1.Rows.Add(New String() {&quot;Verónica&quot;, &quot;Supervisor&quot;, 24})
    DataGridView1.Rows.Add(New String() {&quot;Gabriela&quot;, &quot;Usuario&quot;, 65})
    DataGridView1.Rows.Add(New String() {&quot;Agustín&quot;, &quot;Usuario&quot;, 719})
    DataGridView1.Rows.Add(New String() {&quot;Camila&quot;, &quot;Supervisor&quot;, 4322})
    DataGridView1.Rows.Add(New String() {&quot;Melisa&quot;, &quot;Usuario&quot;, 654})
    DataGridView1.Rows.Add(New String() {&quot;Liliana&quot;, &quot;Soporte&quot;, 22})
End Sub</pre>
<p>Ahora, para comprender mejor el funcionamiento, deberían ejecutar el programa y probar ordenar por las tres columnas. Acá les muestro como quedará cuando ordenamos por la columna puntuación:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview002.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="OrdenandoDatagridview002" border="0" alt="OrdenandoDatagridview002" src="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview002_thumb.jpg" width="424" height="402" /></a></p>
<p>Bueno, la imagen es muy clara: 1, 1023, 111, 122, 22… no es el orden correcto. Para resolver este problema debemos cambiar el orden de la columna Puntuación de <strong>Automatic</strong> a <strong>Programmatic</strong>.</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview003.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="OrdenandoDatagridview003" border="0" alt="OrdenandoDatagridview003" src="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview003_thumb.jpg" width="584" height="411" /></a> </p>
</p>
<p>Bueno, esto es solo el primer paso ahora necesito agregar a nuestro formulario una clase nueva donde programaremos el ordenamiento para las columnas numéricas, la clase es la siguiente: </p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">Public Class OrdenarColumnaNumerica
    Implements System.Collections.IComparer

    Private sortOrderModifier As Integer = 1
    Private Col As Integer = 0

    Public Sub New(ByVal sortOrder As SortOrder, ByVal columna As Integer)
        Col = columna
        If sortOrder = sortOrder.Descending Then
            sortOrderModifier = -1
        ElseIf sortOrder = sortOrder.Ascending Then
            sortOrderModifier = 1
        End If
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
        Implements System.Collections.IComparer.Compare

        Dim DataGridViewRow1 As DataGridViewRow = CType(x, DataGridViewRow)
        Dim DataGridViewRow2 As DataGridViewRow = CType(y, DataGridViewRow)

        Return (Math.Sign(CLng(DataGridViewRow1.Cells(Col).Value) - CLng(DataGridViewRow2.Cells(Col).Value))) * sortOrderModifier
    End Function
End Class</pre>
<p>Una vez que tenemos nuestra clase para manejar el orden de las columnas numéricas, debemos llamarla desde el evento <strong>ColumnHeaderMouseClick</strong> del <strong>datagridview</strong> de la siguiente forma:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">    Private Sub DataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick

        Static Orden As Integer = 1

        If DataGridView1.Rows.Count &gt; 0 Then
            If DataGridView1.Columns(e.ColumnIndex).Name = &quot;Puntuacion&quot; Then
                If Orden = 1 Then
                    DataGridView1.Sort(New OrdenarColumnaNumerica(SortOrder.Ascending, e.ColumnIndex))
                    Orden = 0
                Else
                    DataGridView1.Sort(New OrdenarColumnaNumerica(SortOrder.Descending, e.ColumnIndex))
                    Orden = 1
                End If
            End If
        End If
    End Sub</pre>
<p>Listo! Ahora solo basta ejecutar y probar el programa. Ahora el resultado se verá como en la siguiente imagen correctamente ordenado:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview004.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="OrdenandoDatagridview004" border="0" alt="OrdenandoDatagridview004" src="http://www.solovb.net/wp-content/uploads/2010/11/OrdenandoDatagridview004_thumb.jpg" width="456" height="453" /></a> </p>
<p>Espero que puedas darle una buena utilidad a esta técnica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2010/11/17/ordenando-datagridview/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Validando un DataGridView</title>
		<link>http://www.solovb.net/index.php/2010/11/15/validando-un-datagridview/</link>
		<comments>http://www.solovb.net/index.php/2010/11/15/validando-un-datagridview/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 15:02:29 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[CellValidating]]></category>
		<category><![CDATA[datagrid]]></category>
		<category><![CDATA[DataGridView]]></category>
		<category><![CDATA[ErrorText]]></category>
		<category><![CDATA[validacion]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2010/11/15/validando-un-datagridview/</guid>
		<description><![CDATA[Quiero en esta oportunidad mostrarle un simple ejemplo de validación de datos ingresados en un datagridview. Este es un potente control, muy rico, y con muchísimas opciones de configuración. Esta validación la haremos controlando el evento CellValidating del datagridview. Para el ejemplo vamos a necesitar: un formulario y un datagridview. como se ve en la [...]]]></description>
			<content:encoded><![CDATA[<p>Quiero en esta oportunidad mostrarle un simple ejemplo de <strong>validación de datos</strong> ingresados en un <strong>datagridview</strong>. Este es un potente control, muy rico, y con muchísimas opciones de configuración.</p>
<p>Esta validación la haremos controlando el evento <strong>CellValidating</strong> del <strong>datagridview</strong>.</p>
<p>Para el ejemplo vamos a necesitar: un <strong>formulario</strong> y un <strong>datagridview</strong>. como se ve en la siguiente imagen:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/11/validardatagridview001.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="validardatagridview001" border="0" alt="validardatagridview001" src="http://www.solovb.net/wp-content/uploads/2010/11/validardatagridview001_thumb.jpg" width="605" height="334" /></a></p>
<p>En el evento load del formulario seteamos la propiedad <strong>Dock</strong> para que el control ocupe todo el formulario y creamos las columnas para el ingreso de los datos.</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">DataGridView1.Dock = DockStyle.Fill

DataGridView1.Columns.Add(&quot;Nombre&quot;, &quot;Nombre&quot;)
DataGridView1.Columns.Add(&quot;Apellido&quot;, &quot;Apellido&quot;)
DataGridView1.Columns.Add(&quot;Cargo&quot;, &quot;Cargo&quot;)
DataGridView1.Columns.Add(&quot;Categoria&quot;, &quot;Categoría&quot;)
DataGridView1.Columns.Add(&quot;Sueldo&quot;, &quot;Sueldo&quot;)</pre>
<p>Ahora veamos la validación.</p>
<p>El evento que manejamos se llama CellValidating y con un select case vamos a validar los datos dependiendo de que columna es la que se está editando. Esto lo sabemos porque consultamos:<br />
  <br />DataGridView1.Columns(e.ColumnIndex).Name</p>
<p>Cuando se ingresa un dato no válido debemos completar la propiedad ErrorTex del row que estamos editando con un mensaje de error, el cual aparecerá a la izquierda y lo leemos al colocar el puntero del mouse sobre el icono rojo que aparece.</p>
<p>veamos el codigo:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating

        Select Case DataGridView1.Columns(e.ColumnIndex).Name
            'El nombre quiero que sea obligatorio, por eso
            'no lo dejo salir de la celda hasta que lo ingrese
            Case &quot;Nombre&quot;
                If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
                    DataGridView1.Rows(e.RowIndex).ErrorText = _
                        &quot;El Nombre no puede estar vacío&quot;
                    e.Cancel = True
                End If

            Case &quot;Apellido&quot; 'lo mismo pasa con el apellido, es obligatorio
                If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
                    DataGridView1.Rows(e.RowIndex).ErrorText = _
                        &quot;El Apellido no puede estar vacío&quot;
                    e.Cancel = True
                End If
            Case &quot;Cargo&quot;
                'En el caso del cargo, tengo cuatro opciones o vacío
                'Si no concueda con ninguna no puede salir
                If e.FormattedValue.ToString() &lt;&gt; &quot;Vendedor&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;Encargado&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;Supervisor&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;Gerente&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;&quot; Then
                    DataGridView1.Rows(e.RowIndex).ErrorText = _
                        &quot;El dato no es válido: ingrese Vendedor o Encargado o Supervisor o Gerente&quot;
                    e.Cancel = True
                Else
                    DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
                End If
            Case &quot;Categoria&quot;
                If e.FormattedValue.ToString() &lt;&gt; &quot;A&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;B&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;C&quot; And _
                e.FormattedValue.ToString() &lt;&gt; &quot;&quot; Then
                    DataGridView1.Rows(e.RowIndex).ErrorText = _
                        &quot;Categorias permitidas: A, B o C&quot;
                    e.Cancel = True
                Else
                    DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
                End If
            Case &quot;Sueldo&quot;
                'se valida que sea un dato numérico
                If Not IsNumeric(e.FormattedValue.ToString()) And Not String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
                    DataGridView1.Rows(e.RowIndex).ErrorText = _
                        &quot;Debe ingresar un valor numérico&quot;
                    e.Cancel = True
                Else
                    DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
                End If
        End Select
    End Sub</pre>
<p>Acá les dejo una imagen de como se vería el mensaje de error:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/11/validardatagridview002.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="validardatagridview002" border="0" alt="validardatagridview002" src="http://www.solovb.net/wp-content/uploads/2010/11/validardatagridview002_thumb.jpg" width="546" height="147" /></a></p>
<p>Bueno, como siempre, espero que le puedan dar utilidad y ya saben que pueden mejorar mucho este ejemplo, solo hace falta dedicarle tiempo y ganas!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2010/11/15/validando-un-datagridview/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Como clonar un formulario windows</title>
		<link>http://www.solovb.net/index.php/2010/09/21/como-clonar-un-formulario-windows/</link>
		<comments>http://www.solovb.net/index.php/2010/09/21/como-clonar-un-formulario-windows/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 19:02:00 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[clonar formulario]]></category>
		<category><![CDATA[copiar formulario]]></category>
		<category><![CDATA[designer]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2010/09/21/como-clonar-un-formulario-windows/</guid>
		<description><![CDATA[Muchas veces puede surgir la necesidad de hacer dos o mas formularios iguales o muy parecidos. Lo primero que se nos ocurre es ir al explorador de soluciones, seleccionar un formulario y hacer Control-C y Control-V para crear un nuevo formulario igual al primero, pero… para nuestra sorpresa aparecen unos cuantos errores que nos pueden [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces puede surgir la necesidad de hacer dos o mas formularios iguales o muy parecidos. Lo primero que se nos ocurre es ir al explorador de soluciones, seleccionar un formulario y hacer Control-C y Control-V para crear un nuevo formulario igual al primero, pero… para nuestra sorpresa aparecen unos cuantos errores que nos pueden hacer doler la cabeza. Para ayudar con este tema les presento un breve <strong>tutorial</strong> para saber como <strong>copiar</strong> (a mano) un <strong>formulario windows.</strong></p>
<p>Primero abrimos (para el ejemplo) un nuevo proyecto con un formulario y le agregamos algunos controles y componentes diseñados como más nos guste… aquí un ejemplo:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/09/iguales001.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="iguales001" border="0" alt="iguales001" src="http://www.solovb.net/wp-content/uploads/2010/09/iguales001_thumb.jpg" width="495" height="437" /></a></p>
<p>Para el ejemplo es más que suficiente.</p>
<p>Luego vamos al <strong>explorador de soluciones</strong> y abrimos el código del <strong>designer</strong>. En nuestro caso Form1.designer.vb</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/09/iguales002.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="iguales002" border="0" alt="iguales002" src="http://www.solovb.net/wp-content/uploads/2010/09/iguales002_thumb.jpg" width="495" height="437" /></a>&#160;&#160; </p>
</p>
<p>En la ventana de código copiamos todo desde la subrutina <strong>InitializeComponent</strong>() hasta el final de la clase.</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/09/iguales003.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="iguales003" border="0" alt="iguales003" src="http://www.solovb.net/wp-content/uploads/2010/09/iguales003_thumb.jpg" width="495" height="437" /></a></p>
<p> Ahora viene lo bueno… agregamos a nuestro proyecto un nuevo formulario y sin hacer nada mas abrimos el designer del nuevo formulario (en mi caso Form2.designer.vb) y reemplazamos el código, que en la siguiente imagen aparece seleccionado por el que anteriormente habíamos copiado.</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/09/iguales004.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="iguales004" border="0" alt="iguales004" src="http://www.solovb.net/wp-content/uploads/2010/09/iguales004_thumb.jpg" width="495" height="437" /></a> </p>
<p>Listo! al guardar y ver en vista de diseño tendremos un segundo formulario igualito al primero.</p>
<p>Espero que les sea útil. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2010/09/21/como-clonar-un-formulario-windows/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>IntelliSence: &#8220;Tan &#250;til&#8221;, &#8220;Tan molesto&#8221;</title>
		<link>http://www.solovb.net/index.php/2010/09/17/intellisence-ide-visual-studio/</link>
		<comments>http://www.solovb.net/index.php/2010/09/17/intellisence-ide-visual-studio/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 17:56:53 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Funciones]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IntelliSense]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2010/09/17/intellisence-tan-til-tan-molesto/</guid>
		<description><![CDATA[Cuando comencé a utilizar el IDE de Visual Studio allá por la versión 1.0 (año 2002 aprox.) una de las cosas que más me gustó fue el intelliSense. Tanto como para completar los nombres de las variables, funciones, etc., como para sugerir las propiedades y métodos de las clases y de paso examinar todo lo [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando comencé a utilizar el IDE de <strong>Visual Studio</strong> allá por la versión 1.0 (año 2002 aprox.) una de las cosas que más me gustó fue el <strong>intelliSense</strong>. Tanto como para completar los nombres de las variables, funciones, etc., como para sugerir las propiedades y métodos de las clases y de paso examinar todo lo que se podría hacer con ellas.</p>
<p>Pero… a quien no le ha pasado de molestarse cuando todo el tiempo están apareciendo la ventanita y tapa todo el código que uno necesita ver para confirmar, por ejemplo, como era el nombre de esa variable que estoy queriendo usar.</p>
<p>Para resolver esto, presionaba casi enojado la tecla escape para poder ver el resto del código y luego volver a comenzar con las propiedades y el <strong>intelliSence</strong>.</p>
<p>Ahora a que viene todo esto? es que existe una forma de volver transparente este menú contextual (yo no lo sabía hasta hace muy poco) para poder ver lo que esta debajo del <strong>intelliSence</strong>. Esto se logra manteniendo presionada la tecla CTRL (control). Si no lo conocías, pruébalo. Te va a gustar!</p>
<p>Aquí les dejo dos imágenes que ejemplifican muy bien este comportamiento:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2010/09/intelliSense1.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="intelliSense1" border="0" alt="intelliSense1" src="http://www.solovb.net/wp-content/uploads/2010/09/intelliSense1_thumb.jpg" width="525" height="380" /></a><a href="http://www.solovb.net/wp-content/uploads/2010/09/intelliSense2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="intelliSense2" border="0" alt="intelliSense2" src="http://www.solovb.net/wp-content/uploads/2010/09/intelliSense2_thumb.jpg" width="525" height="380" /></a>Si prestan atención, en la segunda imagen se puede apreciar el menú de <strong>intelliSense</strong> muy transparente (casi invisible) así se verá cuando presionen la tecla control.</p>
<p>Esta funcionalidad esta disponible tanto en <a href="http://www.solovb.net/index.php/2009/01/13/visual-studio-2008-express-edition/">Visual Studio 2008</a> como en <a href="http://www.solovb.net/index.php/2010/05/18/descarga-visual-studio-2010-express-gratis/">Visual Studio 2010</a>.&#160; </p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2010/09/17/intellisence-ide-visual-studio/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Exporta Automaticamente DataTable a Microsoft Excel</title>
		<link>http://www.solovb.net/index.php/2009/11/22/exporta-automaticamente-datatable-a-microsoft-excel/</link>
		<comments>http://www.solovb.net/index.php/2009/11/22/exporta-automaticamente-datatable-a-microsoft-excel/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:15:35 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Funciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Exportar]]></category>

		<guid isPermaLink="false">http://www.solovb.net/?p=687</guid>
		<description><![CDATA[Hoy quiero mostrarles un ejemplo que me ha servido durante mucho tiempo y aún lo sigo utilizando.
Haremos un ejemplo para exportar un DataTable completo a Excel sin importar la cantidad de columnas o filas que este tenga.]]></description>
			<content:encoded><![CDATA[<p>Hoy quiero mostrarles un ejemplo que me ha servido durante mucho tiempo y aún lo sigo utilizando.<br />
Haremos un ejemplo para <strong>exportar </strong>un <strong>DataTable</strong> completo a <strong>Excel </strong> sin importar la cantidad de <strong>columnas </strong>o <strong>filas </strong>que este tenga.</p>
<p>Puede que existan muchas formas de realizar esta tarea, pero encuentro realmente útil este método dado que <strong>sirve para cualquier versión de excel</strong>. Por cuestiones de compatilidad con las nuevas versiones de Excel solo manejaremos 256 columnas.</p>
<p>Lo primero que necesitamos es agregar una referencia a Microsoft.Office.Interop.Excel y lo hacemos de la siguiente forma:</p>
<div id="attachment_689" class="wp-caption aligncenter" style="width: 581px"><img class="size-full wp-image-689" title="ExportarExcel001" src="http://www.solovb.net/wp-content/uploads/2009/11/ExportarExcel001.jpg" alt="Importar referencia a Excel" width="571" height="480" /><p class="wp-caption-text">Importar referencia a Excel</p></div>
<div id="attachment_690" class="wp-caption aligncenter" style="width: 581px"><img class="size-full wp-image-690" title="ExportarExcel002" src="http://www.solovb.net/wp-content/uploads/2009/11/ExportarExcel002.jpg" alt="Importar referencia Excel" width="571" height="452" /><p class="wp-caption-text">Importar referencia Excel</p></div>
<p>Luego necesitamos un <strong>formulario</strong>, un <strong>botón</strong>, un <strong>dataGridView </strong>y una <strong>barra de progreso</strong>. Lo podemos disponer como se ve en la imagen:</p>
<div id="attachment_693" class="wp-caption aligncenter" style="width: 581px"><img class="size-full wp-image-693" title="ExportarExcel003" src="http://www.solovb.net/wp-content/uploads/2009/11/ExportarExcel003.jpg" alt="Formulario aplicación para exportar dataset a excel" width="571" height="355" /><p class="wp-caption-text">Formulario aplicación para exportar dataset a excel</p></div>
<p>Ahora quiero mostrarles <strong>todo el código</strong>, realmente es <strong>sencillo </strong>lo más importante es que <strong>se adapta a cualquier tabla</strong>. Lo van a poder <strong>reutilizar </strong>sin problemas.</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Office.Interop

Public Class Form1
    Private ds As New DataSet

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '//////////////////////////////////////////////////
        '// Creamos la conexión y llenamos el DataGridView
        '//////////////////////////////////////////////////
        Dim cnn As New SqlConnection("Data Source=localhost\sqlexpress;Initial Catalog=Northwind; Integrated Security=True")
        Dim da As New SqlDataAdapter("Select * from customers", cnn)
        da.Fill(ds)
        DataGridView1.DataSource = ds.Tables(0)
    End Sub

    Private Sub btnExportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportar.Click
        '/////////////////////////////
        '// Creamos el Objeto Excel
        '/////////////////////////////
        Dim m_Excel
        Dim objLibroExcel
        Dim objHojaExcel
        m_Excel = CreateObject("Excel.Application")
        objLibroExcel = m_Excel.Workbooks.Add()
        objHojaExcel = objLibroExcel.Worksheets(1)
        objHojaExcel.Name = "Customers"
        objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
        objHojaExcel.Activate()

        '/////////////////////////////////////////////////////////
        '// Definimos dos variables para controlar fila y columna
        '/////////////////////////////////////////////////////////
        Dim fila As Integer = 1
        Dim columna As Integer = 1

        '/////////////////////////////////////////////////
        '// Armamos la linea con los títulos de columnas
        '/////////////////////////////////////////////////
        objHojaExcel.Range("A1").Select()
        For Each dc In ds.Tables(0).Columns
            objHojaExcel.Range(nombreColumna(columna) &amp; 1).Value = dc.ColumnName
            columna += 1
        Next
        fila += 1

        '/////////////////////////////////////////////
        '// Le damos formato a la fila de los títulos
        '/////////////////////////////////////////////
        Dim objRango As Excel.Range = objHojaExcel.Range("A1:" &amp; nombreColumna(ds.Tables(0).Columns.Count) &amp; "1")
        objRango.Font.Bold = True
        objRango.Cells.Interior.ColorIndex = 35

        objRango.Cells.Borders(Excel.XlBordersIndex.xlDiagonalDown).LineStyle = Excel.XlLineStyle.xlLineStyleNone
        objRango.Cells.Borders(Excel.XlBordersIndex.xlDiagonalUp).LineStyle = Excel.XlLineStyle.xlLineStyleNone
        objRango.Cells.Borders(Excel.XlBordersIndex.xlEdgeLeft).LineStyle = Excel.XlLineStyle.xlLineStyleNone
        objRango.Cells.Borders(Excel.XlBordersIndex.xlEdgeRight).LineStyle = Excel.XlLineStyle.xlContinuous
        objRango.Cells.Borders(Excel.XlBordersIndex.xlEdgeTop).LineStyle = Excel.XlLineStyle.xlContinuous
        objRango.Cells.Borders(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlContinuous

        '//////////////////////////////////////////
        '// Cargamos todas las filas del datatable
        '//////////////////////////////////////////
        ProgressBar1.Maximum = ds.Tables(0).Rows.Count
        columna = 1
        ProgressBar1.Value = 0
        For Each dr In ds.Tables(0).Rows
            columna = 1
            For Each dc In ds.Tables(0).Columns
                objHojaExcel.Range(nombreColumna(columna) &amp; fila).Value = dr(dc.ColumnName)
                columna += 1
            Next
            fila += 1
            ProgressBar1.Value += 1
        Next

        '//////////////////////////////////////
        '// Ajustamos automaticamente el ancho
        '// de todas las columnas utilizada
        '//////////////////////////////////////
        objRango = objHojaExcel.Range("A1:" &amp; nombreColumna(ds.Tables(0).Columns.Count) &amp; ds.Tables(0).Rows.Count.ToString)
        objRango.Select()
        objRango.Columns.AutoFit()

        '/////////////////////////////////////
        '// Le decimos a Excel que se muestre
        '/////////////////////////////////////
        MsgBox("Exportación a Excel completa", MsgBoxStyle.Information, ".:: solovb.net ::.")
        m_Excel.Visible = True

    End Sub

    Public Function nombreColumna(ByVal numero As Integer) As String
        Dim columna(256) As String

        columna(1) = "A"
        columna(2) = "B"
        columna(3) = "C"
        columna(4) = "D"
        columna(5) = "E"
        columna(6) = "F"
        columna(7) = "G"
        columna(8) = "H"
        columna(9) = "I"
        columna(10) = "J"
        columna(11) = "K"
        columna(12) = "L"
        columna(13) = "M"
        columna(14) = "N"
        columna(15) = "O"
        columna(16) = "P"
        columna(17) = "Q"
        columna(18) = "R"
        columna(19) = "S"
        columna(20) = "T"
        columna(21) = "U"
        columna(22) = "V"
        columna(23) = "W"
        columna(24) = "X"
        columna(25) = "Y"
        columna(26) = "Z"
        columna(27) = "AA"
        columna(28) = "AB"
        columna(29) = "AC"
        columna(30) = "AD"
        columna(31) = "AE"
        columna(32) = "AF"
        columna(33) = "AG"
        columna(34) = "AH"
        columna(35) = "AI"
        columna(36) = "AJ"
        columna(37) = "AK"
        columna(38) = "AL"
        columna(39) = "AM"
        columna(40) = "AN"
        columna(41) = "AO"
        columna(42) = "AP"
        columna(43) = "AQ"
        columna(44) = "AR"
        columna(45) = "AS"
        columna(46) = "AT"
        columna(47) = "AU"
        columna(48) = "AV"
        columna(49) = "AW"
        columna(50) = "AX"
        columna(51) = "AY"
        columna(52) = "AZ"
        columna(53) = "BA"
        columna(54) = "BB"
        columna(55) = "BC"
        columna(56) = "BD"
        columna(57) = "BE"
        columna(58) = "BF"
        columna(59) = "BG"
        columna(60) = "BH"
        columna(61) = "BI"
        columna(62) = "BJ"
        columna(63) = "BK"
        columna(64) = "BL"
        columna(65) = "BM"
        columna(66) = "BN"
        columna(67) = "BO"
        columna(68) = "BP"
        columna(69) = "BQ"
        columna(70) = "BR"
        columna(71) = "BS"
        columna(72) = "BT"
        columna(73) = "BU"
        columna(74) = "BV"
        columna(75) = "BW"
        columna(76) = "BX"
        columna(77) = "BY"
        columna(78) = "BZ"
        columna(79) = "CA"
        columna(80) = "CB"
        columna(81) = "CC"
        columna(82) = "CD"
        columna(83) = "CE"
        columna(84) = "CF"
        columna(85) = "CG"
        columna(86) = "CH"
        columna(87) = "CI"
        columna(88) = "CJ"
        columna(89) = "CK"
        columna(90) = "CL"
        columna(91) = "CM"
        columna(92) = "CN"
        columna(93) = "CO"
        columna(94) = "CP"
        columna(95) = "CQ"
        columna(96) = "CR"
        columna(97) = "CS"
        columna(98) = "CT"
        columna(99) = "CU"
        columna(100) = "CV"
        columna(101) = "CW"
        columna(102) = "CX"
        columna(103) = "CY"
        columna(104) = "CZ"
        columna(105) = "DA"
        columna(106) = "DB"
        columna(107) = "DC"
        columna(108) = "DD"
        columna(109) = "DE"
        columna(110) = "DF"
        columna(111) = "DG"
        columna(112) = "DH"
        columna(113) = "DI"
        columna(114) = "DJ"
        columna(115) = "DK"
        columna(116) = "DL"
        columna(117) = "DM"
        columna(118) = "DN"
        columna(119) = "DO"
        columna(120) = "DP"
        columna(121) = "DQ"
        columna(122) = "DR"
        columna(123) = "DS"
        columna(124) = "DT"
        columna(125) = "DU"
        columna(126) = "DV"
        columna(127) = "DW"
        columna(128) = "DX"
        columna(129) = "DY"
        columna(130) = "DZ"
        columna(131) = "EA"
        columna(132) = "EB"
        columna(133) = "EC"
        columna(134) = "ED"
        columna(135) = "EE"
        columna(136) = "EF"
        columna(137) = "EG"
        columna(138) = "EH"
        columna(139) = "EI"
        columna(140) = "EJ"
        columna(141) = "EK"
        columna(142) = "EL"
        columna(143) = "EM"
        columna(144) = "EN"
        columna(145) = "EO"
        columna(146) = "EP"
        columna(147) = "EQ"
        columna(148) = "ER"
        columna(149) = "ES"
        columna(150) = "ET"
        columna(151) = "EU"
        columna(152) = "EV"
        columna(153) = "EW"
        columna(154) = "EX"
        columna(155) = "EY"
        columna(156) = "EZ"
        columna(157) = "FA"
        columna(158) = "FB"
        columna(159) = "FC"
        columna(160) = "FD"
        columna(161) = "FE"
        columna(162) = "FF"
        columna(163) = "FG"
        columna(164) = "FH"
        columna(165) = "FI"
        columna(166) = "FJ"
        columna(167) = "FK"
        columna(168) = "FL"
        columna(169) = "FM"
        columna(170) = "FN"
        columna(171) = "FO"
        columna(172) = "FP"
        columna(173) = "FQ"
        columna(174) = "FR"
        columna(175) = "FS"
        columna(176) = "FT"
        columna(177) = "FU"
        columna(178) = "FV"
        columna(179) = "FW"
        columna(180) = "FX"
        columna(181) = "FY"
        columna(182) = "FZ"
        columna(183) = "GA"
        columna(184) = "GB"
        columna(185) = "GC"
        columna(186) = "GD"
        columna(187) = "GE"
        columna(188) = "GF"
        columna(189) = "GG"
        columna(190) = "GH"
        columna(191) = "GI"
        columna(192) = "GJ"
        columna(193) = "GK"
        columna(194) = "GL"
        columna(195) = "GM"
        columna(196) = "GN"
        columna(197) = "GO"
        columna(198) = "GP"
        columna(199) = "GQ"
        columna(200) = "GR"
        columna(201) = "GS"
        columna(202) = "GT"
        columna(203) = "GU"
        columna(204) = "GV"
        columna(205) = "GW"
        columna(206) = "GX"
        columna(207) = "GY"
        columna(208) = "GZ"
        columna(209) = "HA"
        columna(210) = "HB"
        columna(211) = "HC"
        columna(212) = "HD"
        columna(213) = "HE"
        columna(214) = "HF"
        columna(215) = "HG"
        columna(216) = "HH"
        columna(217) = "HI"
        columna(218) = "HJ"
        columna(219) = "HK"
        columna(220) = "HL"
        columna(221) = "HM"
        columna(222) = "HN"
        columna(223) = "HO"
        columna(224) = "HP"
        columna(225) = "HQ"
        columna(226) = "HR"
        columna(227) = "HS"
        columna(228) = "HT"
        columna(229) = "HU"
        columna(230) = "HV"
        columna(231) = "HW"
        columna(232) = "HX"
        columna(233) = "HY"
        columna(234) = "HZ"
        columna(235) = "IA"
        columna(236) = "IB"
        columna(237) = "IC"
        columna(238) = "ID"
        columna(239) = "IE"
        columna(240) = "IF"
        columna(241) = "IG"
        columna(242) = "IH"
        columna(243) = "II"
        columna(244) = "IJ"
        columna(245) = "IK"
        columna(246) = "IL"
        columna(247) = "IM"
        columna(248) = "IN"
        columna(249) = "IO"
        columna(250) = "IP"
        columna(251) = "IQ"
        columna(252) = "IR"
        columna(253) = "IS"
        columna(254) = "IT"
        columna(255) = "IU"
        columna(256) = "IV"

        Return columna(numero)
    End Function
End Class</pre>
<p>Este método me ha servido mucho y espero que a ustedes también&#8230; por favor dejen sus comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2009/11/22/exporta-automaticamente-datatable-a-microsoft-excel/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Listview: Item siempre visible</title>
		<link>http://www.solovb.net/index.php/2009/10/15/listview-item-siempre-visible/</link>
		<comments>http://www.solovb.net/index.php/2009/10/15/listview-item-siempre-visible/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 03:46:00 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[add]]></category>
		<category><![CDATA[agregar item]]></category>
		<category><![CDATA[ListView]]></category>
		<category><![CDATA[listviewitems]]></category>
		<category><![CDATA[siempre visible]]></category>

		<guid isPermaLink="false">http://www.solovb.net/index.php/2009/10/15/listview-item-siempre-visible/</guid>
		<description><![CDATA[Siempre que se agregan nuevos elementos ListviewItems a un control listview, y estos son tantos que el control no tiene espacio suficiente para mostrarlos en pantalla, se agrega una barra de desplazamiento vertical. Esto está perfecto, solo que por default no se ven los nuevos items que se van agregando. Hoy quiero mostrarles como solucionar [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre que se agregan nuevos elementos <strong>ListviewItems</strong> a un control <strong>listview</strong>, y estos son tantos que el control no tiene espacio suficiente para mostrarlos en pantalla, se agrega una barra de desplazamiento vertical. Esto está perfecto, solo que por default no se ven los nuevos items que se van agregando.</p>
<p>Hoy quiero mostrarles como solucionar este pequeño inconveniente.</p>
<p>Los controles de <strong>visual basic .net</strong> cono el <strong>listview</strong> nos brindan una cantidad impresionante de <strong>propiedades</strong> para su <strong>configuración</strong>, tantas que muchas veces se desconocen.</p>
<p>Quiero mostrarlo con un <strong>ejemplo muy sencillo</strong>. Para ello necesitaremos un formulario, un control listview y un botón.</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2009/10/listviewItemSiempreVisible001.jpg"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="listviewItemSiempreVisible001" src="http://www.solovb.net/wp-content/uploads/2009/10/listviewItemSiempreVisible001_thumb.jpg" border="0" alt="listviewItemSiempreVisible001" width="437" height="514" /></a></p>
<p>Las propiedades que mas nos interesan son las siguientes:</p>
<ul>
<li><strong>HideSelection</strong>: la establecemos en false para que aunque el control listview no tenga el foco, sigamos viendo cual es el item seleccionado.</li>
<li><strong>ListView1.FocusedItem.EnsureVisible()</strong> para forzar al item seleccionado a estar siempre visible.</li>
</ul>
<p>Bueno, ahora si el código:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [14]">
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListView1.HideSelection = False
        ListView1.FullRowSelect = True
        ListView1.MultiSelect = False
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Static i As Integer = 0
        i += 1
        ListView1.Items.Add(New ListViewItem("Item número " &#038; i))
        ListView1.Items(ListView1.Items.Count - 1).Selected = True
        ListView1.Items(ListView1.Items.Count - 1).Focused = True

        ListView1.FocusedItem.EnsureVisible()
    End Sub
</pre>
<p>Al ejecutarlo debería verse muy parecido a lo que se muestra en esta imagen:</p>
<p><a href="http://www.solovb.net/wp-content/uploads/2009/10/listviewItemSiempreVisible002.jpg"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="listviewItemSiempreVisible002" src="http://www.solovb.net/wp-content/uploads/2009/10/listviewItemSiempreVisible002_thumb.jpg" border="0" alt="listviewItemSiempreVisible002" width="366" height="446" /></a></p>
<p>Eso es todo, si te sirvió esta información, por favor, deja un comentario.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2009/10/15/listview-item-siempre-visible/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Abrir y Cerrar la puerta del CD-ROM</title>
		<link>http://www.solovb.net/index.php/2009/09/01/abrir-y-cerrar-la-puerta-del-cd-rom/</link>
		<comments>http://www.solovb.net/index.php/2009/09/01/abrir-y-cerrar-la-puerta-del-cd-rom/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 04:07:01 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Abrir]]></category>
		<category><![CDATA[CDROM]]></category>
		<category><![CDATA[Cerrar]]></category>

		<guid isPermaLink="false">http://www.solovb.net/?p=608</guid>
		<description><![CDATA[Basandome en este video que vi hoy en internet decidí publicar este sencillo post sobre como hacer, mediante un programa en visual basic .net, que la puerta del lector de CD's se abra y se cierre.]]></description>
			<content:encoded><![CDATA[<p>Basandome en este video que vi hoy en internet decidí publicar este sencillo post sobre como hacer, mediante un programa en visual basic .net, que la puerta del lector de CD&#8217;s se abra y se cierre.</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/bYcF_xX2DE8&#038;hl=es&#038;fs=1&#038;color1=0x2b405b&#038;color2=0x6b8ab6"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/bYcF_xX2DE8&#038;hl=es&#038;fs=1&#038;color1=0x2b405b&#038;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>Para realizar el ejemplo simplemente necesitamos un formulario y dos botones (abrir y cerrar) como se ve en la imagen:</p>
<p><img alt="" src="/images/abrirCDROM.jpg" class="alignnone" width="275" height="204" /></p>
<p>y el siguiente código:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Public Class Form1
    Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
       (ByVal lpCommandString As String, ByVal lpReturnString As String, _
       ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        AbrirCDROM()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        cerrarCDROM()
    End Sub

    Public Sub AbrirCDROM()
        mciSendString("set CDAudio door open", "", 0, 0)
    End Sub

    Public Sub cerrarCDROM()
        mciSendString("set CDAudio door closed", "", 0, 0)
    End Sub

End Class
</pre>
<p>Listo! a disfrutarlo y si tienes un bebe&#8230; a poner el código dentro de un bucle y a conseguir una cuerda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2009/09/01/abrir-y-cerrar-la-puerta-del-cd-rom/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Usa los colores de Visual Studio en tu programa</title>
		<link>http://www.solovb.net/index.php/2009/08/02/usa-los-colores-de-visual-studio-en-tu-programa/</link>
		<comments>http://www.solovb.net/index.php/2009/08/02/usa-los-colores-de-visual-studio-en-tu-programa/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 19:41:40 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Definiciones]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Brushes]]></category>
		<category><![CDATA[Colores]]></category>
		<category><![CDATA[DrawItemState]]></category>
		<category><![CDATA[DrawMode]]></category>
		<category><![CDATA[DrawRectangle]]></category>
		<category><![CDATA[ListBox]]></category>
		<category><![CDATA[OwnerDrawFixed]]></category>
		<category><![CDATA[PropertyInfo]]></category>

		<guid isPermaLink="false">http://www.solovb.net/?p=592</guid>
		<description><![CDATA[El control ColorDialog nos presenta una paleta de colores tradicional, pero lo cierto es que la de visual studio es mucho más linda y nos muestra todos los colores por su nombre como están definidos en las propiedades del objeto System.Drawing.Color.]]></description>
			<content:encoded><![CDATA[<p>Este ejemplo surgio de una consulta en <a href="http://www.solovb.net/index.php/2009/06/05/cuadro-de-dialogo-para-seleccionar-un-color-colordialog/">este artículo</a>.</p>
<p>El control <strong>ColorDialog</strong> nos presenta una paleta de colores tradicional, pero lo cierto es que la de <strong>visual studio</strong> es mucho más linda y nos muestra todos los colores por su nombre como están definidos en las propiedades del objeto <strong>System.Drawing.Color</strong>.</p>
<p>Dado el problema de que no existe un control que nos muestre esta lista de colores vamos a ver como podemos constriur una nosotros mismos.</p>
<p>Para el ejemplo necesitaremos un nuevo proyecto y dos formularios.</p>
<p>En el primer formulario solo tendremos un baton para llamar al formulario 2, tal como se ve en la siguiente figura:</p>
<p><img class="aligncenter size-full wp-image-593" title="coloresNombre001" src="http://www.solovb.net/wp-content/uploads/2009/08/coloresNombre001.jpg" alt="coloresNombre001" width="407" height="338" /></p>
<p>y el código del boton es el siguiente:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Private Sub btnColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnColor.Click
Dim vForm2 As New Form2
vForm2.ShowDialog()
End Sub
</pre>
<p>y en el siguiente formulario pondremos yn control ListBox y dos botoes (aceptar y cancelar) igual que en el siguiente formulario:</p>
<p><img class="aligncenter size-full wp-image-594" title="coloresNombre002" src="http://www.solovb.net/wp-content/uploads/2009/08/coloresNombre002.jpg" alt="coloresNombre002" width="304" height="296" /></p>
<p>En el evento Load del formulario establecemos algunas propiedades del control ListBox y cargamos los nombres de los colores con el siguiente código:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListBox1.DrawMode = DrawMode.OwnerDrawFixed
ListBox1.ItemHeight = 20

ListBox1.Items.Clear()
ListBox1.BeginUpdate()
For Each pi As Reflection.PropertyInfo In GetType(Color).GetProperties(Reflection.BindingFlags.Static Or Reflection.BindingFlags.Public)
ListBox1.Items.Add(pi.Name)
Next
ListBox1.EndUpdate()
End Sub
</pre>
<p>En la primer linea del Load &#8220;ListBox1.DrawMode = DrawMode.OwnerDrawFixed&#8221;  establecemos que todos los elementos del control se dibujan manualmente y tienen el mismo alto. Esto, ademças, desencadena un suceso DrawItem justo antes de mostrar cada elemento.</p>
<p>Para programar el evento <strong>DrawItem </strong>del <strong>ListBox</strong>, seleccionamos (en la vista de diseño) el ListBox1, presionamos F4 para ver las propiedades, y en la parte de arriba del cuadro de propiedades seleccionamos el icono del rayo para ver los evento que el control tiene disponibles, buscamos DrawItem y le damos doble clic. La siguiente imagen ejemplifica como hacerlo:</p>
<p><img class="aligncenter size-full wp-image-595" title="coloresNombre003" src="http://www.solovb.net/wp-content/uploads/2009/08/coloresNombre003.jpg" alt="coloresNombre003" width="621" height="337" /></p>
<p>y este es el código del evento <strong>DrawItem</strong></p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
Dim rectangulo As Rectangle = e.Bounds

If (e.State And DrawItemState.Selected) Then
e.Graphics.FillRectangle(SystemBrushes.Highlight, rectangulo)
Else
e.Graphics.FillRectangle(Brushes.White, rectangulo)
End If

Dim nombreColor As String = ListBox1.Items(e.Index)

Dim b As New SolidBrush(Color.FromName(nombreColor))

rectangulo.Inflate(-16, -2)
e.Graphics.FillRectangle(b, New Rectangle(rectangulo.X, rectangulo.Y, 30, rectangulo.Height))

e.Graphics.DrawRectangle(Pens.Black, New Rectangle(rectangulo.X, rectangulo.Y, 30, rectangulo.Height))

If (e.State And DrawItemState.Selected) Then
e.Graphics.DrawString(nombreColor, e.Font, Brushes.White, rectangulo.X + 34, rectangulo.Y + 2)
Else
e.Graphics.DrawString(nombreColor, e.Font, Brushes.Black, rectangulo.X + 34, rectangulo.Y + 2)
End If
End Sub
</pre>
<p>Ahora solo nos falta programar los eventosde los dos botones como se ve en el siguiente código:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click
My.Forms.Form1.BackColor = Color.FromName(ListBox1.SelectedItem)
End Sub

Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
Me.Close()
End Sub
</pre>
<p>Bueno, a probar la aplicación&#8230; si todo salió bien, se verá así:</p>
<p><img class="aligncenter size-full wp-image-596" title="coloresNombre004" src="http://www.solovb.net/wp-content/uploads/2009/08/coloresNombre004.jpg" alt="coloresNombre004" width="489" height="436" /></p>
<p>Les dejo algunas definiciones:</p>
<p><strong>Graphics.FillRectangle (Método):</strong> Rellena el interior de un rectángulo especificado por un par de coordenadas, un valor de ancho y un valor de alto.<br />
<strong><br />
Graphics.DrawRectangle (Método):</strong> Dibuja un rectángulo especificado por un par de coordenadas, un valor de ancho y un valor de alto.</p>
<p><strong>Graphics.DrawString (Método):</strong> Dibuja la cadena de texto especificada en la ubicación especificada y con los objetos Brush y Font especificados.</p>
<p>Espero que les sirva y lo puedan usar en sus proyectos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2009/08/02/usa-los-colores-de-visual-studio-en-tu-programa/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

