Foros del Web » Programación para mayores de 30 ;) » .NET »

Agregar elementos de diseño por código Visual Studio 2005

Estas en el tema de Agregar elementos de diseño por código Visual Studio 2005 en el foro de .NET en Foros del Web. Hola, ¿qué tal? Espero me puedan ayudar, estoy trabajando en un proyecto en Visual Studio 2005 (VB Windows Application) y hay varias cosas que no ...
  #1 (permalink)  
Antiguo 14/11/2008, 22:46
Avatar de Arekuzu  
Fecha de Ingreso: junio-2007
Ubicación: Irk
Mensajes: 40
Antigüedad: 16 años, 10 meses
Puntos: 0
Agregar elementos de diseño por código Visual Studio 2005

Hola, ¿qué tal?

Espero me puedan ayudar, estoy trabajando en un proyecto en Visual Studio 2005 (VB Windows Application) y hay varias cosas que no sé cómo hacer y nada más no las hallo en el MSDN:

Es un manejador de tablas de Access, el usuario elige una base de datos (archivo .mdb), y después elige una tabla, y los campos con los datos salen desplegados en un DataGridView. Después el usuario puede modificar todos los datos, y con unos botones puede guardar, borrar, etc.

Lo que no sé hacer es:

1. Obtener la lista de tablas de una base de datos (los nombres, para que el usuario pueda elegir una)
2. Obtener la lista de columnas de la tabla elegida, para el DataGridView.
3. Añadir TextBox's y Label's a partir de cuántas columnas tiene la tabla. Como es un número variable, supongo que se tiene que hacer a base de código.


Gracias de antemano, un saludo muy grande!
  #2 (permalink)  
Antiguo 15/11/2008, 18:13
Avatar de Arekuzu  
Fecha de Ingreso: junio-2007
Ubicación: Irk
Mensajes: 40
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Agregar elementos de diseño por código Visual Studio 2005

Bueno pues después de buscarle mucho, averigüé que agregar controles en tiempo de ejecución se hace así:

En el Form Load haces el control, y después lo agregas (fue más fácil de lo que pensaba)
Código:
Dim x As New TextBox

Me.Controls.Add(x)
Lo que me falta averiguar es cómo cambiarle las coordenadas a los controles, porque me aparecen en la esquina superior izquierda y no los puedo mover.

Y sigo atorado con los otros dos puntos, la lista de tablas de la base de datos, y la lista de columnas de una tabla en específico.

Espero me puedan ayudar, gracias de antemano :)
  #3 (permalink)  
Antiguo 15/11/2008, 18:30
 
Fecha de Ingreso: julio-2008
Mensajes: 140
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Agregar elementos de diseño por código Visual Studio 2005

Buenas. Para cambiar las coordenas hace esto

Dim x As New TextBox

x.Location = new Point(x,y)

Me.Controls.Add(x)

Al igual con la propiedad Size, el tamaño del control. Y también podés modificar todas las demás propiedades.

En Access no sé como se obtienen las tablas, consultá en google "extraer tablas de base de datos access". En otra base de datos, por lo general tiene una base de datos con la información de todas las bases de datos que crees.

Las columnas se obtienen solas al hacer "select * from tabla" desde el DataSet.
  #4 (permalink)  
Antiguo 16/11/2008, 09:15
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Agregar elementos de diseño por código Visual Studio 2005

Cita:
Iniciado por Arekuzu Ver Mensaje
Hola, ¿qué tal?

Espero me puedan ayudar, estoy trabajando en un proyecto en Visual Studio 2005 (VB Windows Application) y hay varias cosas que no sé cómo hacer y nada más no las hallo en el MSDN:

Es un manejador de tablas de Access, el usuario elige una base de datos (archivo .mdb), y después elige una tabla, y los campos con los datos salen desplegados en un DataGridView. Después el usuario puede modificar todos los datos, y con unos botones puede guardar, borrar, etc.

Lo que no sé hacer es:

1. Obtener la lista de tablas de una base de datos (los nombres, para que el usuario pueda elegir una)
2. Obtener la lista de columnas de la tabla elegida, para el DataGridView.
3. Añadir TextBox's y Label's a partir de cuántas columnas tiene la tabla. Como es un número variable, supongo que se tiene que hacer a base de código.


Gracias de antemano, un saludo muy grande!
Hola, lo de añadir controles, veo que ya lo has solucionado así que me remito a la primera y segunda pregunta.

En cuanto a la segunda, entiendo que quieres mostrar en el DataGridView solamente las columnas seleccionadas en el List.

A ver si te vale este ejemplo comentado.
Código:
Imports System.Data.OleDb

Public Class Form8
    Dim db As New ADODB.Connection

    Private Sub Form8_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' creamos y abrimos la conexión a la base de datos
        Dim sql As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurDir() & "\Northwind.mdb"
        db.Open(sql)
        ' creamos un objeto recordset ADO tipo Schema
        Dim rsSchema As ADODB.Recordset = db.OpenSchema(ADODB.SchemaEnum.adSchemaTables)
        ' recorremos el recordset y cargamos en el combo cada una de las tablas de la BD
        While Not rsSchema.EOF
            If rsSchema.Fields("TABLE_TYPE").Value = "TABLE" Then
                ComboBox1.Items.Add(rsSchema.Fields("TABLE_NAME").Value)
            End If
            rsSchema.MoveNext()
        End While
        rsSchema.Close()

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        ' listamos en el CheckedListBox todos los campos de la tabla seleccionada en el ComboBox
        Dim rs As New ADODB.Recordset
        rs.Open("SELECT * FROM " & ComboBox1.Text, db)
        CheckedListBox1.Items.Clear()
        For i As Integer = 0 To rs.Fields.Count - 1
            CheckedListBox1.Items.Add(rs.Fields(i).Name)
        Next
        rs.Close()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sql As String = "SELECT "
        Try
            For i As Integer = 0 To CheckedListBox1.CheckedItems.Count - 1
                ' incluimos en la cadena los items seleccionados
                sql = sql & CheckedListBox1.CheckedItems(i) & ","
            Next
            ' eliminamos la última coma de la cadena
            sql = Microsoft.VisualBasic.Left(sql, Len(sql) - 1)
            ' y completamos la sentencia
            sql = sql & " FROM " & ComboBox1.Text
            ' abrimos un recordset ADO con la sentencia anterior
            Dim rs As New ADODB.Recordset
            rs.Open(sql, db)
            ' definimos un DataAdapter y un DataSet
            Dim oDa As OleDbDataAdapter = New OleDbDataAdapter
            Dim oDs As New DataSet
            ' cargamos el DataSet
            oDa.Fill(oDs, rs, ComboBox1.Text)
            ' y lo mostramos en el DataGridView
            DataGridView1.DataSource = oDs.Tables(0)
        Catch Err As Exception
            ' occurrió algún error, lo mostramos
            MessageBox.Show(Err.Message)
        End Try
    End Sub
End Class
El resultado sería algo como esto:


  #5 (permalink)  
Antiguo 17/11/2008, 02:23
Avatar de Arekuzu  
Fecha de Ingreso: junio-2007
Ubicación: Irk
Mensajes: 40
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: Agregar elementos de diseño por código Visual Studio 2005

Código:
   Dim oDa As OleDbDataAdapter = New OleDbDataAdapter
            Dim oDs As New DataSet
Eso y el openSchema con adSchemaTables son una maravilla, muchas gracias!! Había encontrado un método más rudimentario (meterse a MSysObjects y filtrar las tablas, pero hay que modificar permisos y blablabla).

Muchísimas gracias! Ya lo logré avanzar muchísimo!

Ahora a ver si me podrían ayudar con unas nuevas dudas en concreto:

1. Me pidieron unos botones con los que pueda navegar el DataGridView (Siguiente, Anterior, Primero, Último). Pero no encuentro ninguna propiedad del DGV que me permita moverme entre registros (algo como .MoveNext). Y también un botón que automáticamente agregue un registro en blanco para editar.

A lo más que llego es a la propiedad .CurrentRow, pero me marca que es 'Read Only' :(


2. A los controles que agregué de forma dinámica, cómo puedo controlarles eventos? Porque necesito que aparezca la información del registro (row) en el que está posicionado el usuario, en esas textboxes.

Por ejemplo con una tabla 2 columnas se agregan solos 2 labels y 2 textbox (un arreglo de 2 labels y un arreglo de 2 textbox):

id: [textbox]
nombre: [textbox]


¿Pero cómo haría para que la propiedad .Text de esos textbox, coincidiera con la columna del registro seleccionado?

Supongo que tiene algo que ver con el GotFocus del DGV, pero no logro pensar una manera de manejar eso con un número variable de textbox.

Solo me faltan esas dos cosas y lo termino.

Gracias de antemano, un saludo muy grande!!

PD: Gracias también a Fueguino me sirvió perfectamente lo de new Point(x,y) ;)
  #6 (permalink)  
Antiguo 17/11/2008, 06:46
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Agregar elementos de diseño por código Visual Studio 2005

Cita:
Iniciado por Arekuzu Ver Mensaje
Ahora a ver si me podrían ayudar con unas nuevas dudas en concreto:

1. Me pidieron unos botones con los que pueda navegar el DataGridView (Siguiente, Anterior, Primero, Último). Pero no encuentro ninguna propiedad del DGV que me permita moverme entre registros (algo como .MoveNext). Y también un botón que automáticamente agregue un registro en blanco para editar.

A lo más que llego es a la propiedad .CurrentRow, pero me marca que es 'Read Only' :(


2. A los controles que agregué de forma dinámica, cómo puedo controlarles eventos? Porque necesito que aparezca la información del registro (row) en el que está posicionado el usuario, en esas textboxes.


Solo me faltan esas dos cosas y lo termino.

Gracias de antemano, un saludo muy grande!!

PD: Gracias también a Fueguino me sirvió perfectamente lo de new Point(x,y) ;)

Hola Arekuzu,

1. Para navegar por el DataGridView .Net tiene un control llamado BindingNavigator, es sencillo de usar.

2. Para aplicar eventos a controles creados dinámicamente, prueba este ejemplo

Código:
Public Class Form1
    Private TxtPos As New Point(10, 50)

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' creamos tres controles TextBox
        For x As Integer = 0 To 2
            Dim CuadroTexto As New TextBox
            CuadroTexto.Name = "TextBox " + x.ToString()
            CuadroTexto.Text = "Text" & x.ToString()
            CuadroTexto.Location = New Point(TxtPos.X + 10, TxtPos.Y)
            TxtPos.Y += CuadroTexto.Height + 15
            ' le agregamos el evento GotFocus
            AddHandler CuadroTexto.GotFocus, AddressOf xFocus
            ' aquí le puedes seguir agregando eventos mediante la instrucción AddHandler
            Controls.Add(CuadroTexto)
        Next x
        Me.Show()
    End Sub

    Private Sub xFocus(ByVal sender As Object, ByVal e As EventArgs)
        ' aquí puedes comparar el TextBox que tiene el foco
        Label1.Text = "El foco lo tiene " & sender.text
        ' instrucciones...
    End Sub

End Class
Saludos y suerte!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:43.