Como puedo posicionar el ‘CurrentCell’ de mi DataGridView

Que nadie se lo tome a mal! Pero después de reírnos un rato, nos encontramos a menudo perdiendo la tarde en búsqueda de cómo realizar las cosas más sencillas. Intentando dar respuesta a la repetida pregunta de cómo posicionarnos dentro de nuestro DataGridView… Ahí va la respuesta:

Dim Columna As Integer = 0, Fila As Integer = 0
Me.DataGridView1.CurrentCell = _
   Me.DataGridView1(Columna, Fila)

La de tumbos que a veces damos, porque creo que difícil no es! J
Saludos,
Pep Lluis,

De Excel a Texto pasando por un DataGridView


” Crear un archivo de texto con el contenido
” de las celdas de un DataGridView de los
” datos cargados de una hoja de excel.


Hoja



Imports System.Data.OleDb

Public Class Form1
    ‘Definir conexion,adaptador y Dataset
    Private MiConexion As New OleDbConnection _
    (“Provider=Microsoft.Jet.OLEDB.4.0;” + _
     “Extended Properties = ‘Excel 8.0’;” + _
     “Data Source=|DataDirectory|\libro1.xls;”)
    Private MiAdaptador As New OleDbDataAdapter(“SELECT * FROM [Hoja1$]”, MiConexion)
    Private MiDataSet As New DataSet()

    Private Sub Form1_Load() Handles MyBase.Load
        ‘Abrir y llenar el DGV con la hoja de excel
        MiConexion.Open()
        MiAdaptador.Fill(MiDataSet)
        Me.DataGridView1.DataSource = MiDataSet.Tables(0)
        ‘Crear un documento de texto
        Dim ATexto = IO.File.CreateText(“MiExport.txt”)
        For Each row As DataGridViewRow In Me.DataGridView1.Rows
            For Each col As DataGridViewColumn In Me.DataGridView1.Columns
                ‘Añadir una entrada por celda
                ATexto.Write(row.Cells(col.Index).Value)
                ‘separar con un tabulador
                ATexto.Write(Chr(Keys.Tab))
            Next
            ‘Añadir una linea por fila
            ATexto.WriteLine()
        Next
        ATexto.Close()
    End Sub

End Class

Bloc
🙂
 

Totalizar una Columna en un DataGridView

Siguiendo la consulta de Jesús Pérez, preguntando como totalizar la suma de una columna de un DataGridView, poniendo como ejemplo recorrer las filas de una columna y efectuar las operaciones que consideremos oportunas.

Aquí tenéis el enlace para resolverlo según MSDN:
http://msdn.microsoft.com/es-es/library/system.data.datatable.compute.aspx

' Computar la suma de la columna 'Capital'
Dim total As Object = dt.Compute("SUM(Capital)", Nothing)
' visualizar el resultado en la barra
Me.Text = total.ToString

Si por el contrario optamos por hacerlo recorriendo las filas de la Columna… (tal i como me habéis solicitado) el código seria algo similar al siguiente :

... Load()
'Disparar el calculo cada vez que editamos 
AddHandler Me.dataGridView1.CellEndEdit, AddressOf Sumar
'Calcular totalizando la columna 3 "Salario"
Me.dataGridView1.Columns(3).HeaderText = "Sueldo"
Me.dataGridView1.AllowUserToAddRows = False
Me.dataGridView1.CurrentCell = dataGridView1.Rows(0).Cells(3)
Sumar()
... End Sub
'
' Sumar las cantidades de una columna
'
Private Columna As Integer = 3
Sub Sumar()
    Dim Total As Integer = 0      
    'Acumular el total
    Dim UltimaFila As Integer = Me.dataGridView1.Rows.Count
    'Solo calculamos si modificamos la columna
    If Me.dataGridView1.CurrentCell.ColumnIndex = Columna Then
        For Each row As DataGridViewRow In Me.dataGridView1.Rows
            If row.Index < UltimaFila - 1 Then Total += row.Cells(Columna).Value
        Next
        Me.dataGridView1.Rows(UltimaFila - 1).Cells(3).Value = Total.ToString
    End If
End Sub

Pd. No dudeis en pedirme el proyecto completo si estais interesados, o si quereis comentar alguna parte del codigo.

 

Dos Tablas y sus relaciones en un DataGridView a traves de un ‘ComboBoxColumn’

Ejemplo de cómo añadir una columna de selección unida a una tabla de ‘maestros’ y relacionada con su identificador en la tabla ‘detalles’, en casos reales solo teneis que substituir las tablas por los ‘sources’ de las tablas en vuestra BD.
Me gustara recibir vuestros comentarios… 😉


Combo3
 


Imports System
Imports System.Data

Public Class Form1
    Private dataGridView1 As New DataGridView()


    Private Sub Form1_Load() Handles Me.Load
       
        ‘ Simular tabla con los Detalles
       
        Dim Detalles As New DataTable(“Detalle”)
        Detalles.Columns.Add(“Actividad”)
        Detalles.Columns.Add(“Nombre”)
        Detalles.Columns.Add(“Telefono”)
        Detalles.Rows.Add(“001”, “Pep Lluis”, “231.321.321”)
        Detalles.Rows.Add(“002”, “Luis Franco”, “Internacional”)
        Detalles.Rows.Add(“003”, “Marc Rubiño”, “111.222.333”)
        Detalles.Rows.Add(“004”, “Javier Conesa”, “91.244.32.32”)
       
        ‘ Simular tabla con los Id’s Maestros
       
        Dim Maestros As New DataTable(“Maestro”)
        Maestros.Columns.Add(“Actividad”)
        Maestros.Columns.Add(“Descripcion”)
        Maestros.Rows.Add(“001”, “POgramaor”)
        Maestros.Rows.Add(“002”, “Torero”)
        Maestros.Rows.Add(“003”, “Banderillero”)
        Maestros.Rows.Add(“004”, “ANALista”)

       
        ‘ Construir el DS y establecer relaciones
       
        Dim MiDataSet As New DataSet
        MiDataSet.Tables.Add(Detalles)
        MiDataSet.Tables.Add(Maestros)
        MiDataSet.Relations.Add(“Actividad”, _
              MiDataSet.Tables(“Maestro”).Columns(“Actividad”),_
              MiDataSet.Tables(“Detalle”).Columns(“Actividad”))
        
        ‘ Añadir una columna ‘ComboBox’
        ‘ Conteniendo la tabla ‘Maestro’
       
        Dim MiBoxColumn As New DataGridViewComboBoxColumn
        MiBoxColumn.DisplayMember = “Descripcion”
        MiBoxColumn.ValueMember = “Actividad”
        MiBoxColumn.DataPropertyName = “Actividad”
        MiBoxColumn.DataSource = MiDataSet.Tables(“Maestro”)
        Me.dataGridView1.Columns.Add(MiBoxColumn)
       
        ‘ Visualizar el DGV con la columna combo ‘Maestro’
        ‘ y las columnas y tablas de ‘Detalle’
       
        Me.dataGridView1.Dock = DockStyle.Fill
        Me.Controls.Add(dataGridView1)
        Me.dataGridView1.DataSource = MiDataSet.Tables(“Detalle”)

   End Sub
End Class


Si os interesa en determinadas situaciones podeis “camuflar” el combo para que tenga un aspecto como este :



Combo4


De esta forma no podran modificar ni desplegar las opciones y su aspecto sera como el de cualquier otra columna.
Ajustando las propiedades :


        MiBoxColumn.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
        MiBoxColumn.ReadOnly = True


Saludos,
Pep Lluis,


PD. Agradecemos la participacion de los actores secundarios (Javier, Luis i Marc), aunque tengo mis dudas sobre si son personajes reales o ficticios 😉

DataGridView… Quiero saltar de de Columna!!! no de fila

Muchos de nosotros aprovechamos el control DataGridView como visualizador, sin embargo además puede ser una excelente ayuda para añadir nuevas filas a nuestras estructuras de datos.

En un proceso donde la información se estructura mediante columnas y líneas, el objetivo es introducir nuevas filas con la mayor facilidad posible, es entonces cuando nos percatamos de que por defecto el DataGridView actúa de una forma un tanto inconveniente para nuestro cometido. Cada vez que pulsamos ‘enter’ ya sea en modo ‘edición’  el efecto es que nos crea una nueva fila desplazándose acto seguido a la primera celda de la misma (como en Excel), entonces nos obliga a utilizar los cursores para reubicar el ‘foco’ a la celda donde va a continuar nuestra próxima entrada. Realmente es un inconveniente, pues nos hace perder muchísimo tiempo empleándolo en pulsaciones simplemente inútiles.

Dicho esto, para poder introducir datos de izquierda a derecha tal y como estamos acostumbrados en la mayoría de situaciones en la que manejamos información, podemos recurrir a varios recursos, os proponemos ver como anulando las funciones ‘ProcessDialogKey’  ‘OnKeyDown’ y rescribiendo el código para que la pulsación de una tecla ‘enter’ sea substituida por un ‘tab’  utilizando un ‘sendkeys’, pudiendo conseguir una mejora increíble en la funcionalidad. También en una segunda propuesta os introducimos a como manejar el direccionamiento de selección de las ‘celdas’ de un DataGridView capturando las pulsaciones en el ‘PreProcessMessage’, ambas heredando la funcionalidad DataGridView y añadiendo a esta personalidad propia.

Esperamos que os sea de utilidad… solo tenéis que ¡cortar y pegar!

Pep Lluis y Rafael.

'' (c) Pep Lluis & Rafa Vargas

'' Ambos ejemplos vienen derivados de una inquietud compartida en

'' el ultimo Code Camp del Escorial en el 2006 entre Rafa Vargas y

'' Pep Lluis… no cabe duda del lema 'Comparte y Aprenderas'.

''

Public Class form1

    Private WithEvents _MiDGView1 As New DgvPlus     'Mi DGV, que traduce el 'Enter' en 'Tab'

    Private WithEvents _MiDGView2 As New MiDGView    'Mi DGV, que controla la posicion de la celda actual

    '

    ' al lanzar nuestro form (en el momento de carga)

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        '

        'Construir el primer DGV

        _MiDGView1.Dock = DockStyle.Left                                          'Acoplarlo a la izquierda

        _MiDGView1.ColumnCount = 4                                                'con cuatro columnas

        _MiDGView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill     'Ajustarlo al tamaño

        _MiDGView1.Columns(0).HeaderText = "Caso A"                               'Etiquetar columna

        Me.Controls.Add(_MiDGView1)                                               'Añadirlo al form

        '

        'Construir el segundo DGV

        _MiDGView2.Dock = DockStyle.Right

        _MiDGView2.ColumnCount = 4

        _MiDGView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill

        _MiDGView2.Columns(0).HeaderText = "Caso B"

        Me.Controls.Add(_MiDGView2)

        '

        'La ventana (aspecto)

        Me.Width = Me._MiDGView1.Width + Me._MiDGView2.Width + 25           'Ajustar el ancho del form

        Me.Text = "Pep/Rafa DataGridView"                                    'Ponerle titulo

    End Sub

End Class

'

' Nuestra personalizacion para MiDGView —————————————————————

'

Public Class MiDGView

    Inherits DataGridView       'Heredar del DataGridView

    '

    'Prepocesar mensajes

    Public Overrides Function PreProcessMessage(ByRef msg As System.Windows.Forms.Message) As Boolean

        If msg.Msg = 257 And msg.WParam.ToInt32 = 13 Then                    'Si es 'KeyDown' y 'Enter'

            Dim MiCol As Integer = 0

            Dim MiFil As Integer = Me.CurrentCell.RowIndex – 1

            If Me.CurrentCell.ColumnIndex < Me.ColumnCount – 1 Then          'Si noSalimos del limite

                MiCol = Me.CurrentCell.ColumnIndex + 1                       'Siguiente columna

            End If

            If MiFil > -1 Then Me.CurrentCell = Me(MiCol, MiFil) 'Posicionar columna

        End If

        Return MyBase.PreProcessMessage(msg)

    End Function

End Class

'

' Nuestra personalizacion para DGVPlus —————————————————————

'

Public Class DgvPlus

    Inherits DataGridView   'Heredar del DataGridView

    '

    'en el 'processDialogKey'… cuando estamos en edicion

    Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean

        If keyData = Keys.Enter Then                'Si es 'enter'

            SendKeys.Send(Chr(Keys.Tab))            'Enviar un 'Tab'

            Return True                             'Marcar como procesado

        Else                                        'en caso contrario

            Return MyBase.ProcessDialogKey(keyData) 'devolver KeyData

        End If

    End Function

    '

    ' en 'OnKeyDown'… cuando no estamos en edicion

    Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)

        If e.KeyData = Keys.Enter Then              'Si es 'enter'

            SendKeys.Send(Chr(Keys.Tab))            'Enviar un 'Tab'

        Else

            MyBase.OnKeyDown(e)                     'Devolver el KeyEventArgs

        End If

    End Sub

End Class

Copiar filas entre dos DataGridView

Siguiendo la discusión en los foros MSDN de VB en Español, os adjunto una propuesta de como copiar una fila entre DataGridView's. Existen muchisimas formas de hacerlo y os animo a discutirlas aqui. Os dejo un ejemplo simple, para animaros a proponer ejemplos mas sutiles.

Como siempre prodeis descargar DataGridView2 en 'attachments'

Un Abrazo,
Pep Lluis,