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

Datagridview con columna combo

Estas en el tema de Datagridview con columna combo en el foro de .NET en Foros del Web. Hola a todos! estoy intentando cargar un datagridview mediante código, con la particularidad que hay un campo que en la base de datos guarda 0/-1 ...
  #1 (permalink)  
Antiguo 30/11/2010, 07:00
 
Fecha de Ingreso: septiembre-2009
Ubicación: Galicia
Mensajes: 111
Antigüedad: 14 años, 7 meses
Puntos: 3
Datagridview con columna combo

Hola a todos!

estoy intentando cargar un datagridview mediante código, con la particularidad que hay un campo que en la base de datos
guarda 0/-1 y yo quiero que muestre "Si/No". Para ello defino una DataGridViewComboBoxColumn, pero no me funciona del
todo bien. Aparece el combo, me muestra los valores si y no cuando despliego, pero no cuando carga el grid. Me hace lo que
aparece en esta imagen:

http://img263.imageshack.us/img263/772/dibujokjq.jpg


Y este es el código que tengo. ¿Que estoy haciendo mal? Gracias de antemano!!

Código:
    Dim Conexion As String
    Dim Sql As String
    Dim DataAdapter As SqlDataAdapter
    Dim DataSet As New DataSet


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Conexion = "Data Source=Equipo;Initial Catalog=Datos;Persist Security Info=True;User ID=Sa;Password=XXXX"


        Sql = "SELECT CodigoEmpresa, CodigoArticulo, Inactivo FROM Articulos ORDER BY CodigoArticulo"
        DataAdapter = New SqlDataAdapter(Sql, Conexion)
        DataSet.Reset()
        DataAdapter.Fill(DataSet, "Articulos")


        Dim a As New DataGridViewTextBoxColumn
        a.DataPropertyName = "CodigoEmpresa"
        a.Name = "CodigoEmpresa"
        DataGridView1.Columns.Add(a)

        Dim b As New DataGridViewTextBoxColumn
        b.DataPropertyName = "CodigoArticulo"
        b.Name = "CodigoArticulo"
        DataGridView1.Columns.Add(b)

        Dim c As New DataGridViewComboBoxColumn
        c.DataPropertyName = "Inactivo"
        c.Name = "Inactivo"
        c.DataSource = GetDatos()
        c.DisplayMember = "valor"
        c.ValueMember = "key"
        DataGridView1.Columns.Add(c)

        Me.DataGridView1.AutoGenerateColumns = False
        Me.DataGridView1.DataSource = Nothing
        Me.DataGridView1.DataSource = DataSet.Tables("Articulos")
    End Sub

    Private Function GetDatos() As DataTable

        Dim dt As New DataTable
        dt.Columns.Add("valor")
        dt.Columns.Add("key")

        Dim row As DataRow = dt.NewRow
        row("valor") = "Si"
        row("key") = "-1"
        dt.Rows.Add(row)

        row = dt.NewRow
        row("valor") = "No"
        row("key") = "0"
        dt.Rows.Add(row)

        Return dt

    End Function

    Private Sub DataGridView1_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError

    End Sub
  #2 (permalink)  
Antiguo 30/11/2010, 21:52
Avatar de devilinside  
Fecha de Ingreso: marzo-2008
Ubicación: En Perú
Mensajes: 73
Antigüedad: 16 años
Puntos: 6
Respuesta: Datagridview con columna combo

Cita:
Iniciado por jarogo Ver Mensaje
Hola a todos!

estoy intentando cargar un datagridview mediante código, con la particularidad que hay un campo que en la base de datos
guarda 0/-1 y yo quiero que muestre "Si/No". Para ello defino una DataGridViewComboBoxColumn, pero no me funciona del
todo bien. Aparece el combo, me muestra los valores si y no cuando despliego, pero no cuando carga el grid. Me hace lo que
aparece en esta imagen:

http://img263.imageshack.us/img263/772/dibujokjq.jpg


Y este es el código que tengo. ¿Que estoy haciendo mal? Gracias de antemano!!

Código:
    Dim Conexion As String
    Dim Sql As String
    Dim DataAdapter As SqlDataAdapter
    Dim DataSet As New DataSet


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Conexion = "Data Source=Equipo;Initial Catalog=Datos;Persist Security Info=True;User ID=Sa;Password=XXXX"


        Sql = "SELECT CodigoEmpresa, CodigoArticulo, Inactivo FROM Articulos ORDER BY CodigoArticulo"
        DataAdapter = New SqlDataAdapter(Sql, Conexion)
        DataSet.Reset()
        DataAdapter.Fill(DataSet, "Articulos")


        Dim a As New DataGridViewTextBoxColumn
        a.DataPropertyName = "CodigoEmpresa"
        a.Name = "CodigoEmpresa"
        DataGridView1.Columns.Add(a)

        Dim b As New DataGridViewTextBoxColumn
        b.DataPropertyName = "CodigoArticulo"
        b.Name = "CodigoArticulo"
        DataGridView1.Columns.Add(b)

        Dim c As New DataGridViewComboBoxColumn
        c.DataPropertyName = "Inactivo"
        c.Name = "Inactivo"
        c.DataSource = GetDatos()
        c.DisplayMember = "valor"
        c.ValueMember = "key"
        DataGridView1.Columns.Add(c)

        Me.DataGridView1.AutoGenerateColumns = False
        Me.DataGridView1.DataSource = Nothing
        Me.DataGridView1.DataSource = DataSet.Tables("Articulos")
    End Sub

    Private Function GetDatos() As DataTable

        Dim dt As New DataTable
        dt.Columns.Add("valor")
        dt.Columns.Add("key")

        Dim row As DataRow = dt.NewRow
        row("valor") = "Si"
        row("key") = "-1"
        dt.Rows.Add(row)

        row = dt.NewRow
        row("valor") = "No"
        row("key") = "0"
        dt.Rows.Add(row)

        Return dt

    End Function

    Private Sub DataGridView1_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError

    End Sub
hola, no me da el tiempo para probar tu código pero cuando he trabajado con combos he usado la propiedad DataPropertyName para indicarle el nombre de la columna (del datargidview) que actua como el SLECTEDvaluemember . prueba quitando esa línea.
  #3 (permalink)  
Antiguo 01/12/2010, 06:44
 
Fecha de Ingreso: septiembre-2009
Ubicación: Galicia
Mensajes: 111
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Datagridview con columna combo

Cita:
Iniciado por devilinside Ver Mensaje
hola, no me da el tiempo para probar tu código pero cuando he trabajado con combos he usado la propiedad DataPropertyName para indicarle el nombre de la columna (del datargidview) que actua como el SLECTEDvaluemember . prueba quitando esa línea.
Hola devilinside, gracias por contestar!

he probado lo que tu dices, pero entonces esa columna queda desvinculada de la base de datos, digamos que es una columna que está en el "aire": cuando cargo el datagrid no me aparecen los valores que hay en la base de datos (aparecen todos los combos vacios) y cuando le doy a un boton guardar tampoco me actualiza los datos.

Entiendo que esa línea es para establecer la relación entre el campo del grid y el campo de la base de datos, y por tanto no se puede omitir (o por lo menos a mi no me funciona bien si la quito)

¿Se te ocurre otra cosa? Gracias nuevamente por el interés!!!
  #4 (permalink)  
Antiguo 02/12/2010, 09:40
Avatar de devilinside  
Fecha de Ingreso: marzo-2008
Ubicación: En Perú
Mensajes: 73
Antigüedad: 16 años
Puntos: 6
Respuesta: Datagridview con columna combo

Creo, que sé lo que está sucediendo. Debe ser por que son idénticos los nombres de columnas ( el nombre de tu columna del combo tiene el mismo nombre de la columna que contiene el valor que viene de la BD). Para evitar eso puedes renombrar la columna que viene de tu BD.

Cita:
Iniciado por jarogo Ver Mensaje
Dim Conexion As String
Dim Sql As String
Dim DataAdapter As SqlDataAdapter
Dim DataSet As New DataSet


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Conexion = "Data Source=Equipo;Initial Catalog=Datos;Persist Security Info=True;User ID=Sa;Password=XXXX"


Sql = "SELECT CodigoEmpresa, CodigoArticulo, Inactivo as Inact FROM Articulos ORDER BY CodigoArticulo"
DataAdapter = New SqlDataAdapter(Sql, Conexion)
DataSet.Reset()
DataAdapter.Fill(DataSet, "Articulos")


Dim a As New DataGridViewTextBoxColumn
a.DataPropertyName = "CodigoEmpresa"
a.Name = "CodigoEmpresa"
DataGridView1.Columns.Add(a)

Dim b As New DataGridViewTextBoxColumn
b.DataPropertyName = "CodigoArticulo"
b.Name = "CodigoArticulo"
DataGridView1.Columns.Add(b)

Dim c As New DataGridViewComboBoxColumn
c.DataPropertyName = "Inact"
c.Name = "Inactivo"
c.DataSource = GetDatos()
c.DisplayMember = "valor"
c.ValueMember = "key"
DataGridView1.Columns.Add(c)

Me.DataGridView1.AutoGenerateColumns = False
Me.DataGridView1.DataSource = Nothing
Me.DataGridView1.DataSource = DataSet.Tables("Articulos")
End Sub

Private Function GetDatos() As DataTable

Dim dt As New DataTable
dt.Columns.Add("valor")
dt.Columns.Add("key")

Dim row As DataRow = dt.NewRow
row("valor") = "Si"
row("key") = "-1"
dt.Rows.Add(row)

row = dt.NewRow
row("valor") = "No"
row("key") = "0"
dt.Rows.Add(row)

Return dt

End Function
Puedes enlazar la columna que viene de la BD con la propiedad DataPropertyName como lo estás haciendo. O bien dejar esa columna suelta y ocultarla, pero realizar la asignación respectiva de forma manual, inmediatamente luego de cargar los datos a la grilla con un for each:

Código Vb.Net:
Ver original
  1. Dim Row as DataRow
  2.     Me.DataGridView1.DataSource=DataSet.Tables("Articulos")
  3.     for each Row in Me.DataGridView1.Rows
  4.          Row.Cells ("Inact").Value =   Row.Cells ("Inactivo").Value  
  5.     Next

Última edición por devilinside; 03/12/2010 a las 09:24
  #5 (permalink)  
Antiguo 10/12/2010, 02:18
 
Fecha de Ingreso: septiembre-2009
Ubicación: Galicia
Mensajes: 111
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Datagridview con columna combo

Hola de nuevo Devilinside!

he estado revisando tu código pero sigo igual...

Lo que me dices arriba de modificar el nombre de la columna no cambia nada: al cargar el grid me aparece el 0/-1 en vez del Si/No.

Y lo de abajo, es un poco más lioso: tendría que tener una columna a mayores oculta y hacer el bucle posterior. El grid puede tener miles de registros y quizá varias columnas combo, con lo que tengo miedo que se ralentice demasiado.

La mejor opción sería la primera, usando el DataPropertyName, pero no me va bien...

¿Se te ocurre algo? Gracias igualmente por el interés!!!
  #6 (permalink)  
Antiguo 10/12/2010, 12:39
Avatar de SDEK  
Fecha de Ingreso: diciembre-2009
Ubicación: MX
Mensajes: 156
Antigüedad: 14 años, 3 meses
Puntos: 8
Respuesta: Datagridview con columna combo

El problema es que estas asignado al valueMember el campo "Key" de tu tabla.

Código VB:
Ver original
  1. Dim c As New DataGridViewComboBoxColumn
  2.         c.DataPropertyName = "Inactivo"
  3.         c.Name = "Inactivo"
  4.         c.DataSource = GetDatos()
  5.         c.DisplayMember = "valor"
  6.         c.ValueMember = "key"
  7.         DataGridView1.Columns.Add(c)

el valor de "key", como muestra este fragmento de tu codigo, tiene el valor 0:

Código VB:
Ver original
  1. row = dt.NewRow
  2.         row("valor") = "No"
  3.         row("key") = "0"
  4.         dt.Rows.Add(row)
__________________
Tecnologías de la Información
Karel Priego
| @karelpriego
  #7 (permalink)  
Antiguo 13/12/2010, 02:14
 
Fecha de Ingreso: septiembre-2009
Ubicación: Galicia
Mensajes: 111
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Datagridview con columna combo

Cita:
Iniciado por SDEK Ver Mensaje
El problema es que estas asignado al valueMember el campo "Key" de tu tabla.

el valor de "key", como muestra este fragmento de tu codigo, tiene el valor 0:
No creo que ese sea el error... Para eso son las propiedades "DisplayMember" y "ValueMember": display es lo que mostrará y value lo que guardará en base de datos. Y en el display tengo el Si/No.

Gracias igualmente!
  #8 (permalink)  
Antiguo 14/12/2010, 11:25
Avatar de devilinside  
Fecha de Ingreso: marzo-2008
Ubicación: En Perú
Mensajes: 73
Antigüedad: 16 años
Puntos: 6
Respuesta: Datagridview con columna combo

Hola Jarogo, disculpa por no responder antes. Bueno esta vez sí me detuve a revisar y probar el código (aunq muy rápidamente). Hice pruebas y te dejo el código que funciona sin errores. Tú lo acomodas de acuerdo a tu necesidad.

Código Vb.Net:
Ver original
  1. Private Function DevuelveDatos() As DataTable
  2.  
  3.         Dim dt As New DataTable
  4.         dt.Columns.Add("CodigoEmpresa")
  5.         dt.Columns.Add("CodigoArticulo")
  6.         dt.Columns.Add("Inact")
  7.  
  8.  
  9.         Dim row As DataRow = dt.NewRow
  10.         row("CodigoEmpresa") = "1"
  11.         row("CodigoArticulo") = "1"
  12.         row("Inact") = "-1"
  13.         dt.Rows.Add(row)
  14.  
  15.         row = dt.NewRow
  16.         row("CodigoEmpresa") = "2"
  17.         row("CodigoArticulo") = "2"
  18.         row("Inact") = "0"
  19.         dt.Rows.Add(row)
  20.  
  21.         row = dt.NewRow
  22.         row("CodigoEmpresa") = "3"
  23.         row("CodigoArticulo") = "2"
  24.         row("Inact") = "-1"
  25.         dt.Rows.Add(row)
  26.  
  27.         row = dt.NewRow
  28.         row("CodigoEmpresa") = "4"
  29.         row("CodigoArticulo") = "2"
  30.         row("Inact") = "0"
  31.         dt.Rows.Add(row)
  32.  
  33.         row = dt.NewRow
  34.         row("CodigoEmpresa") = "5"
  35.         row("CodigoArticulo") = "4"
  36.         row("Inact") = "0"
  37.         dt.Rows.Add(row)
  38.  
  39.  
  40.         Return dt
  41.  
  42.     End Function
  43.  
  44.     Private Function GetDatos() As DataTable
  45.  
  46.         Dim dt As New DataTable
  47.         dt.Columns.Add("valor")
  48.         dt.Columns.Add("key")
  49.  
  50.         Dim row As DataRow = dt.NewRow
  51.         row("valor") = "Si"
  52.         row("key") = "-1"
  53.         dt.Rows.Add(row)
  54.  
  55.         row = dt.NewRow
  56.         row("valor") = "No"
  57.         row("key") = "0"
  58.         dt.Rows.Add(row)
  59.  
  60.         Return dt
  61.  
  62.     End Function
  63.  
  64.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  65.  
  66.         Me.DataGridView1.DataSource = DevuelveDatos()
  67.  
  68.         Dim d As New DataGridViewComboBoxColumn
  69.         d.DataSource = GetDatos()
  70.         d.Name = "Inactivo"
  71.         d.DisplayMember = "valor"
  72.         d.ValueMember = "key"
  73.         d.DataPropertyName = "Inact"
  74.         DataGridView1.Columns.Add(d)
  75.  
  76.         'Esta columna devería ocultarse automáticamente, pero curiosamente no lo hace, así que lo hice manualmente XD. Luego reviso.
  77.         Me.DataGridView1.Columns("Inact").Visible = False
  78.  
  79.     End Sub

Espero haberte ayudado.
Saludos.

Última edición por devilinside; 15/12/2010 a las 10:29
  #9 (permalink)  
Antiguo 16/12/2010, 05:14
 
Fecha de Ingreso: septiembre-2009
Ubicación: Galicia
Mensajes: 111
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Datagridview con columna combo

Gracias de nuevo por tu interés y tu tiempo.

He copiado tu código en una nueva aplicación y a priori hace lo que necesito.

Voy a adaptarlo ahora a mi proyecto, a ver que tal va.

  #10 (permalink)  
Antiguo 16/12/2010, 08:52
Avatar de devilinside  
Fecha de Ingreso: marzo-2008
Ubicación: En Perú
Mensajes: 73
Antigüedad: 16 años
Puntos: 6
Respuesta: Datagridview con columna combo

Bien (y)!!

Etiquetas: columna, combo, datagridview
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 15:57.