Todas las entradas de: peplluis

DataGridView sin conexion a datos – Dimensionar filas y columnas

Este ejemplo nos muestra como crear un conjunto de filas y columnas en un DataGridView sin estar enlazado a ninguna fuente de datos, puede ser util en situaciones donde nos interesa representar datos en una cuadricula de visualizacion. Para evitar que el usuario pueda añadir filas, hemos puesto su propiedad ‘AllowUserToAddRows’ a ‘Falso’ y para evitar la edicion de las celdas ‘enabled’ en ‘Falso’. Os podeis entretener un poquito y si os interesa podeis ocultar la fila y columna que hace de cabezera o si preferimos podemos ponerles titulos, tambien personalizar el ancho / alto, el color … en fin.

 

 

Public Class Form1

    Private _MiDGV As New DataGridView      'Nuestro DataGrid

 

    '

    'Construir el aspecto de nuestro DataGrid

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

        _MiDGV.Dock = DockStyle.Fill            'Acoplar al form

        _MiDGV.Enabled = False                  'Impedir la edicion

        _MiDGV.AllowUserToAddRows = False       'Sin opcion añadir filas

        'Dimensionar el ancho automaticamente

        _MiDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill

        Me.Controls.Add(_MiDGV)                 'Añadir el Grid al form

        Me.OrdenN(3, 3)                         'Empezar con un orden 3*3

    End Sub

 

    '

    'Al pulsar las teclas 1/2/3/4/5

    Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp

        Select Case e.KeyValue              'Al pulsar .. 1/2/3/4/5

            Case 49 : OrdenN(1, 1)          'Crear un cubo de 1*1

            Case 50 : OrdenN(2, 2)          '2*2

            Case 51 : OrdenN(3, 3)          '3*3

            Case 52 : OrdenN(4, 4)          '4*4

            Case 53 : OrdenN(5, 5)          '5*5

        End Select

    End Sub

    '

    'Crear un Grid de dimension f(ilas) c(columnas)

    Private Sub OrdenN(ByVal f As Integer, ByVal c As Integer)

        Me._MiDGV.Rows.Clear()          'Eliminar todas las filas

        _MiDGV.ColumnCount = c          'Dimensionar el numero de columnas

        Me._MiDGV.Rows.Add(f)           'Dimensionar el numero de filas

 

        Dim Numerar As Integer = 0      'Numerar el contenido de las celdas

        For Each row As DataGridViewRow In Me._MiDGV.Rows

            For Each col As DataGridViewColumn In Me._MiDGV.Columns

                Numerar += 1

                row.Cells(col.Index).Value = Numerar.ToString

            Next

        Next

    End Sub

End Class

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,

Visualizar una hoja de Excel en un DataGridView

Aqui teneis un ejemplo para visualizar una hoja de Excel en un DataGridView.
Como Siempre podeis descargaros el Codigo haciendo click en 'attachments'

System.Data.OleDb

Public Class Form1
 
Private MiConexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties = 'Excel 8.0'; Data Source=|DataDirectory|\hoja1.xls;")
 
Private MiAdaptador As New OleDbDataAdapter("SELECT * FROM [Hoja1$]", MiConexion)
 
Private MiDataSet As New DataSet()
 
Private MiEnlazador As New BindingSource
 
 
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   
Dim commandbuilder As New OleDb.OleDbCommandBuilder(Me.MiAdaptador)
   
MiConexion.Open()
    MiAdaptador.Fill(MiDataSet)
    MiEnlazador.DataSource = MiDataSet.Tables(0)
   
Me.DataGridView1.DataSource = MiEnlazador
 
End Sub

End Class
 
Pep Lluis,

Introducir datos desde un textbox a una base access en vb.net

La idea basica es utilizar un 'bindingsource' y un commandbuilder para tu adataptador de datos, a partir de este concepto es tan simple como añadir un 'datarow' o registro a tu tabla de datos 'datatable' cada vez que pulsamos 'enter' y la longitud de los datos introducidos es mayor de cero. Posteriormente para actualizar o añadir los registros del 'datatable' a la BD de access utilizaremos el mandato 'update' (al pulsar un boton en nuestro caso), o asociado al momento que consideres oportuno.

Puedes descargarte este ejemplo haciendo click en 'attachments'

Imports System.Data.OleDb
Imports System.Data.DataRow

Public Class Form1
 
Private MiConexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\bd1.mdb")
 
Private MiAdaptador As New OleDbDataAdapter("SELECT * FROM Nombres", MiConexion)
 
Private MiDataSet As New DataSet()
 
Private MiEnlazador As New BindingSource

  Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
   
If (e.KeyChar = Chr(Keys.Enter)) And (Me.TextBox1.Text.Length > 0) Then
     
Dim nombre As DataRow
      nombre = MiDataSet.Tables(0).NewRow()
      nombre(
"Nombre") = TextBox1.Text
      MiDataSet.Tables(0).Rows.Add(nombre)
     
Me.TextBox1.Text = ""
     
Me.ComboBox1.SelectedIndex = Me.ComboBox1.Items.Count – 1
   
End If
 
End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   
Dim commandbuilder As New OleDb.OleDbCommandBuilder(Me.MiAdaptador)
    MiConexion.Open()
    MiAdaptador.Fill(MiDataSet)
    MiEnlazador.DataSource = MiDataSet.Tables(0)
   
Me.ComboBox1.DataSource = MiEnlazador
   
Me.ComboBox1.DisplayMember = "Nombre"
   
Me.ComboBox1.ValueMember = "Id"
   
Me.TextBox1.Select()
 
End Sub

  Private Sub Guardar(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   
Me.MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))
 
End Sub

Espero que sea de tu utilidad.
Pep Lluis,

Actualizar una BD Access, utilizando un DataGridView

A peticion de Ester, en el foro Español de Visual Basic, me complace adjuntaros un pequeño proyecto para actualizar los datos de una BD de access desde un DataGridView. Debo destacar y debemos situar este ejemplo dentro de un contexto de manipulacion de bases de datos relativamente pequeñas, desconozco su rendimiento si es usado en tablas de dimensiones considerables, por lo que este ejemplo es solo para dar una idea de como lo hariamos desde este control y en ningun caso como solucion profesional a la consulta/actualizacion de una BD.

Saludos,
Pep LLuis,

Introducir datos desde un textbox a una Bd.mdb en VB6

A peticion de nuestro amigo snellah, en el foro de Visual Basic (spanish), os adjunto el proyecto para su descarga…

En Visual Basic 6 Una de las maneras mas simples cuando estas empezando, es el uso de los componentes 'Data' y 'MSFlexGrid' de la barra de herramientas. Es tan simple como arrastrar un 'textbox' un 'msflexgrid' un 'data' y un 'command', en la propiedad 'datasource' del msflexgrid le seleccionas 'data1' y luego insertas este codigo al evento 'load' y 'command_click' ….

Private Sub Command1_Click()
    Me.Data1.Recordset.AddNew
    Me.Data1.Recordset("Texto") = Me.Text1.Text
    Me.Data1.Recordset.Update
    Me.Data1.Refresh
    Me.MSFlexGrid1.Col = 2
    Me.MSFlexGrid1.TopRow = Me.MSFlexGrid1.Rows – 1
    Me.MSFlexGrid1.Refresh
End Sub

Private Sub Form_Load()
    Me.Data1.DatabaseName = "Bd1.mdb"
    Me.Data1.RecordSource = "Tabla1"
    Me.Data1.Refresh
    '
    'la proiedad de datasouce del MSFlexGrid1 debe enlazarse con 'Data1'
    Me.MSFlexGrid1.ColWidth(0) = 200
    Me.MSFlexGrid1.ColWidth(1) = 400
    Me.MSFlexGrid1.ColWidth(2) = 3300
End Sub

Este ejemplo inserta el contenido de text1.text en la ultima posicion de la Bd1.mdb, a partir de aqui podrias introducirte para utilizar los objetos  'DataBase y RecordSet' y disponer de un mayor control. Espero vuestros comentarios.
Pep Lluis,

 

Visualizar una columna de una BD de Access en un Combo

En plena efervescencia del SQL Express 2005 como almacen de lujo en nuestras pequeñas aplicaciones de datos, continua siendo frecuente en algunos foros de VB preguntas referentes al enlace de ciertos controles con BD's de Access. La respuesta habitual es un link a toda la documentacion de ADO… DAO… SqlClient, lo que ha cambiado desde VB6, desde VB2003 o lo que es mas recomendable en VB2005. Verdaderamente es una buena practica conocer todas las posibilidades de acceso a datos (tipados, no tipados… ufff), pero en ayuda a los que estan empezando creo que es mas beneficioso un simple ejemplo. ¡ Ahi Va ! 

En algunas ocasiones puede sernos util poder cargar las opciones de nuestros combos, desde una base de datos access. Imagemos que mantenemos una lista de poblaciones… provincias… articulos, etc. desde Access, y que posteriormente utilizamos esta en una aplicacion para seleccionar las opciones de las mismas como parte de formularios cliente, en un proceso de introduccion de datos.

Imports System.Data.OleDb

Class Form1
   Private objConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; User ID=Admin; Data Source=C:\Bd1.mdb"
)
   Private objAdapter As New OleDbDataAdapter("SELECT * FROM Productos"
, objConn)
   Private objDataSet As New
DataSet()
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase
.Load
      objConn.Open()
      objAdapter.Fill(objDataSet)
      Me
.ComboBox1.DataSource = objDataSet.Tables(0)
      Me.ComboBox1.DisplayMember =
"Columna"
      Me.ComboBox1.ValueMember =
"Id"
      objConn.Close()
   End
Sub
End
Class

¿verdad que facil?
Pep Lluis,