<?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; Ordenar</title>
	<atom:link href="http://www.solovb.net/index.php/tag/ordenar/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>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<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>9</slash:comments>
		</item>
		<item>
		<title>Ordenar datos en un ListView</title>
		<link>http://www.solovb.net/index.php/2009/03/18/ordenar-datos-en-un-listview/</link>
		<comments>http://www.solovb.net/index.php/2009/03/18/ordenar-datos-en-un-listview/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 12:40:43 +0000</pubDate>
		<dc:creator>Eliseo</dc:creator>
				<category><![CDATA[Controles]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[ListView]]></category>
		<category><![CDATA[Ordenar]]></category>

		<guid isPermaLink="false">http://www.solovb.net/?p=330</guid>
		<description><![CDATA[usando como base el <a href="http://www.solovb.net/index.php/2009/03/18/llenar-un-listview-con-un-listado-de-directorio/">ejemplo anterior</a>, veremos como podemos en, <a href="http://www.solovb.net">visual basic .net</a>, ordenar los datos del listview por alguna de sus columnas.]]></description>
				<content:encoded><![CDATA[<p>usando como base el <a href="http://www.solovb.net/index.php/2009/03/18/llenar-un-listview-con-un-listado-de-directorio/">ejemplo anterior</a>, veremos como podemos en, <strong><a href="http://www.solovb.net">visual basic .net</a></strong>, <strong>ordenar los datos </strong>del <strong>listview</strong> por alguna de sus columnas.</p>
<p>Al proyecto <a href="http://www.solovb.net/index.php/2009/03/18/llenar-un-listview-con-un-listado-de-directorio/">anterior</a> le agregaremos dos botones para seleccionar cual es el orden deseado. Así como se ve en la imagen siguiente:</p>
<p><img class="alignnone" src="/images/listview002.jpg" alt="" width="719" height="441" /></p>
<p>Luego en el mismo código del formulario vamos a crear dos clases nuevas (OrdenarPorNombre y Ordenar por Tamaño), y en el los eventos lick de los botones seteamos la propiedad <strong>ListViewItemSorter </strong>del <strong>listview </strong>con una nueva instancia de la clase correspondiente al orden seleccionado. El código es breve, así que no costará mucho analizarlo. A continuación les dejo todo el código del formulario:</p>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Imports System.IO
Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim d As New DirectoryInfo("C:\Windows")
ListView1.View = View.Details
ListView1.FullRowSelect = True

ListView1.BeginUpdate()
ListView1.Items.Clear()

For Each f As FileInfo In d.GetFiles
Dim item As New ListViewItem(f.Name)

item.SubItems.Add(f.Length)
item.SubItems.Add(f.CreationTime)
item.SubItems.Add(f.LastWriteTime)
item.SubItems.Add(f.LastAccessTime)

ListView1.Items.Add(item)
Next
ListView1.EndUpdate()

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'Ordenar por nombre
ListView1.ListViewItemSorter = New ordenarPorNombre
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
'Ordenar por tamaño
ListView1.ListViewItemSorter = New ordenarPorTamaño
End Sub
End Class

Class ordenarPorNombre
Implements IComparer
</pre>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements System.Collections.IComparer.Compare
Dim item1 As ListViewItem = CType(x, ListViewItem)
Dim item2 As ListViewItem = CType(y, ListViewItem)
Return String.Compare(item1.Text, item2.Text)
End Function
End Class
</pre>
<pre class="brush: vbnet; ruler: false; first-line: 1; highlight: [0]">
Class ordenarPorTamaño
Implements IComparer

Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements System.Collections.IComparer.Compare
Dim item1 As ListViewItem = CType(x, ListViewItem)
Dim item2 As ListViewItem = CType(y, ListViewItem)
Return Math.Sign(CLng(item1.SubItems(1).Text) - CLng(item2.SubItems(1).Text))
End Function
End Class

</pre>
<p>Como siempre, espero que el código les sea de utilidad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solovb.net/index.php/2009/03/18/ordenar-datos-en-un-listview/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
