none
Obtener celda inicial y celda Final de un rango celeccionado en DataGridView RRS feed

  • Pregunta

  • Que tal Buen Dia a todos!

    Tengo un DataGridView el cual se llena con informacion de un Archivo de Excel

    y carga toda una hoja de excel la cual contiene informacion de venta

    Se desa Seleccionarcierto rango de celdas para dividir el archivo en encabezado y detalle, para asi sacar la celda inicial y la celda final :

    la seleccionar un un rango de celdas de izquierda a derecha, bajando por dar un ejemplo 5 filas y al dar click al boton funciona como quiero este es el codigo:

                Dim i As Integer = 0
                Dim cadena As String = ""
    
                Dim cie = Trim(Chr(dgvExcel.SelectedCells(0).OwningColumn.Index + 65)) & Trim(Str(dgvExcel.SelectedCells(0).OwningRow.Index + 1))
                Dim cfe = Trim(Chr(dgvExcel.SelectedCells(selectedCellCount - 1).OwningColumn.Index + 65)) & Trim(Str(dgvExcel.SelectedCells(selectedCellCount - 1).OwningRow.Index + 1))
    
                Label1.Text = "celda Inicial : " & cie
                Label2.Text = "celda Inicial : " & cfe
    

    Esto Funciona correctamente es decir si selecciono desde la celda (0,0) hasta la celda (2,2)

    me imprime:

     Celda inicial : A1

     Celda Final : C3

    Lo cual equivale a las celdas celeccionadas en el archivo de excel.

    El problema aparece cuando cambias la direccion de seleccion, si el primer clic para celeccionar lo haces de abajo hacia arriba de derecha a izquierda, aun que sea la misma seleccion cambian los valores mostrados.

    Saludosa todos y gracisa de antemano

    lunes, 7 de marzo de 2016 23:07

Respuestas

Todas las respuestas

  • Lo que puedes hacer es ordenar la colección SelectedCells antes de coger la primera y última celda:

            If dgvExcel.SelectedCells.Count>0 Then            
                Dim sortedCells=dgvExcel.SelectedCells.Cast(Of DataGridViewCell) _
                    .OrderBy(Function(c) c.RowIndex).ThenBy(Function(c) c.ColumnIndex)
                Dim firstCell = sortedCells.First()
                Dim lastCell = sortedCells.Last()
                Label1.Text = String.Format("{0}{1}", Chr(firstCell.ColumnIndex + 65), firstCell.RowIndex + 1)
                Label2.Text = String.Format("{0}{1}", Chr(lastCell.ColumnIndex + 65), lastCell.RowIndex + 1)
            End If
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 8 de marzo de 2016 9:08
  • Muchas gracias Asier

    Lo estube probando pero no me funciono esta parte

    Dim sortedCells=dgvExcel.SelectedCells.Cast(Of DataGridViewCell) _ .OrderBy(Function(c) c.RowIndex).ThenBy(Function(c) c.ColumnIndex)

    Quizas por la version del Visual Studio que estoy utilizando (VS2005 en VB)

    Pero al ver tu codgo y analizar un poco me surguieron algunas ideas y lo pude solucionar, de una manera muy sencilla mas no se si sea la mas optima.

    Lo realize asi :

    Dim i As Integer = 0
    
            rowInitial = 0
            rowFinal = 0
            colInitial = 0
            colFinal = 0
    
            Dim row As Integer = 0
            Dim col As Integer = 0
    
            For i = 0 To dgvExcel.SelectedCells.Count - 1
                row = dgvExcel.SelectedCells.Item(i).RowIndex + 1
                col = dgvExcel.SelectedCells.Item(i).ColumnIndex
    
                If i = 0 Then
                    rowInitial = row
                    rowFinal = row
                    colInitial = col
                    colFinal = col
                End If
    
                If row < rowInitial Then
                    rowInitial = row
                End If
    
                If row > rowFinal Then
                    rowFinal = row
                End If
    
                If col < colInitial Then
                    colInitial = col
                End If
    
                If col > colFinal Then
                    colFinal = col
                End If
    
            Next
    
            MsgBox("Celda Inicial : " & Chr(colInitial + 65) & rowInitial)
            MsgBox("Celda Final : " & Chr(colFinal + 65) & rowFinal)

    Gracias!

    jueves, 10 de marzo de 2016 17:57
  • Sí, entiendo entonces que estás usando el Framework 2.0 con lo que no puedes utilizar LINQ, así que sí, no te queda otra opción.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 10 de marzo de 2016 20:00