Discussion:
Cambiar tipo de columna en un DataGridView
(demasiado antiguo para responder)
Paul
2008-06-16 08:06:17 UTC
Permalink
Hola,

Tengo un datagridView con la proiedad AutoGenerateColumn=true. Quiero
que una de las columnas en vez de ser una caja de texto sea un combo,
pero no se como camviarlo.

Alguna idea?

Gracias
SoftJaén
2008-06-16 13:00:38 UTC
Permalink
Post by Paul
Tengo un datagridView con la proiedad AutoGenerateColumn=true. Quiero
que una de las columnas en vez de ser una caja de texto sea un combo,
pero no se como camviarlo.
Si las columnas las has creado en tiempo de diseño, simplemente tienes que
editar las columnas, seleccionar aquella que deseas modificar, y en su
propiedad «ColumnType» le indicas el valor «DataGridViewComboBoxColumn».

Y si las columnas las generas en tiempo de ejecución, no te va a quedar más
remedio que añadir una columna tipo «DataGridViewComboBoxColumn» al control
DataGridView, previa eliminación de la columna tipo
«DataGridViewTextBoxColumn»:

' Eliminamos la columna llamada NombreColumna
'
DataGridView1.Columns.Remove("NombreColumna")

' Creamos la nueva columna
'
Dim column As New DataGridViewComboBoxColumn
With column
.Name = "NombreColumna"
.HeaderText = "Nombre Encabezado"
End With

' Añadimos la columna la cual aparecerá en la primera posición
'
DataGridView1.Columns.Insert(0, column)

Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
yodelmis
2008-07-31 22:17:08 UTC
Permalink
Saludos.

Yo, tengo la misma duda, pero en mi caso, la grilla y el combo estan
enlazados a una base de datos. En este caso, el ejemplo propuesto me da
error, ademas de este ejemplo e probado con el ejemplo que esta en al ayuda.
(estoy seguro de que es un error mio)

les comento:
tengo la siguientes tablas:
REGISTRO(idregistro,idregistrador,causadelregistro) ;
REGISTRADORES(id,nombre,alias)

PROBLEMA:
Sacar en la grilla la tabla REGISTRO y sustituir idregistrador por un combo
que permita escoger al registrador.



GRACIAS.
SoftJaén
2008-08-01 04:01:05 UTC
Permalink
Post by yodelmis
Yo, tengo la misma duda, pero en mi caso, la grilla y el combo estan
enlazados a una base de datos. En este caso, el ejemplo propuesto me da
error, ...
Hola:

Y el error que te da, ¿se supone que lo tengo que imaginar o me invento un
error cualquiera?

Como dices que tanto la "grilla" como el control ComboBox están "enlazados"
a una base de datos, entiendo que el control DataGridView genera
automáticamente las columnas en tiempo de ejecución. Si es así, tienes que
hacer lo que le indiqué a Paul: añadir una columna tipo
«DataGridViewComboBoxColumn» al control DataGridView, previa eliminación de
la columna tipo «DataGridViewTextBoxColumn» que genera automáticamente el
runtime de .net:

' Eliminamos la columna llamada NombreColumna
'
DataGridView1.Columns.Remove("NombreColumna")

' Creamos la nueva columna
'
Dim column As New DataGridViewComboBoxColumn
With column
.Name = "NombreColumna"
.HeaderText = "Nombre Encabezado"
End With

' Añadimos la columna la cual aparecerá en la primera posición
'
DataGridView1.Columns.Insert(0, column)
Post by yodelmis
REGISTRO(idregistro,idregistrador,causadelregistro) ;
REGISTRADORES(id,nombre,alias)
Sacar en la grilla la tabla REGISTRO y sustituir idregistrador por un
combo que permita escoger al registrador.
Consulta en la ayuda de Visual Studio las propiedades «DisplayMember» (para
que el control se rellene con los valores del campo «Nombre» de la tabla
«Registradores») y «ValueMember» (para obtener el valor del campo «Id» de la
tabla «Registradores» correspondiente al elemento seleccionado en el control
ComboBox).

Si ya tienes relleno un objeto DataTable con los datos de la tabla
«Registradores», el control DataGridViewComboBoxColumn lo rellenarías de la
siguiente manera:

' Creamos la nueva columna
'
Dim column As New DataGridViewComboBoxColumn
With column
.Name = "IdRegistrador"
.HeaderText = "Nombre Registrador"
.DataSource = objetoDataTableRegistradores
.DisplayMember = "Nombre"
.ValueMember = "Id"
End With

Obviamente, entiendo que sí sabes rellenar de datos el control DataGridView.

Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
yodelmis
2008-08-04 16:58:13 UTC
Permalink
Saludos

ante todo muchas gracias por la respuesta y disculpa por no poner el error.

El problema luego de probar, es que el combo se ve en la grilla
(DataGridView) y carga bien la lista de registradores, pero no sale con los
nombres de los registradoes que corresponden a cada registro, (el combo no
traduce el id). Tratando de explicarme mejor cuando muestro la grilla, esta
saca todos los campos pero en el caso del combo no sale nada y si selecciono
un valor en el combo este no me actualiza la grilla, es como si el combo y
la grilla no se entendieran.

debo comentar que en mi caso, ademas de lo que me sugieres, termine con un
"grilla1.columns.add(comboboxcolumn)"

NOTA :Debo comentar que estoy utilizando LINQ to SQL.
SoftJaén
2008-08-05 06:16:34 UTC
Permalink
Post by yodelmis
El problema luego de probar, es que el combo se ve en la grilla
(DataGridView) y carga bien la lista de registradores, pero no sale con
los nombres de los registradoes que corresponden a cada registro, (el
combo no traduce el id). Tratando de explicarme mejor cuando muestro la
grilla, esta saca todos los campos pero en el caso del combo no sale nada
y si selecciono un valor en el combo este no me actualiza la grilla, es
como si el combo y la grilla no se entendieran.
debo comentar que en mi caso, ademas de lo que me sugieres, termine con un
"grilla1.columns.add(comboboxcolumn)"
NOTA :Debo comentar que estoy utilizando LINQ to SQL.
Discúlpame, pero no me entero de nada. Por un lado dices que la "grilla"
carga bien la lista de registradores, y por otro lado dices que en el combo
no sale nada. ¿?

Lo siento, pero para poder intentar ayudarte, primero me tendré que enterar
bien de lo que estás haciendo, y lo más importante, cómo lo estás haciendo.

Como dices que los nombres de los registradores no se corresponden con los
registros, no me queda más que pensar que has ordenado alfabéticamente los
elementos de la columna tipo ComboBox, pero como dices que en el combo no
sale nada, pues la verdad es que no sé lo que pensar.

En la consulta SQL de selección que efectuas para recuperar los registros,
procura que los registros vengan ya ordenados por el orden que deseas que
aparezcan los elementos en la columna tipo ComboBox, para ello utiliza una
cláusula ORDER BY.
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
yodelmis
2008-08-06 22:05:25 UTC
Permalink
saludos

tratare de explicarme con este ejemplo:
Tabla Usuarios(Id,nombre)
Table Reporte(Id,Idusuario,textoreporte)

lo que me ocurre es lo siguiente:

1.Tengo una funcion que consulta la tabla reportes y pone los datos en la
grilla (esto se ejecuta OK)
2.Tengo una funcion que llena el combo con todos los usuarios de la base
(Esto se ejecuta OK)
3.Tengo una function que borra la columna que yo diga (esto se ejecuta OK)
4.Tengo una function que adiciona el combo a la grilla (esto esta OK)

El problema es que el combo aparece sin ningun valor seleccionado
ejemplo
Usuarios:
1 -- pepe
2 -- robe
3 -- ana

Reporte
1 -- 1 -- reporte1
2 -- 1 -- reporte2
3 -- 2 -- reporte3

en la grilla se muestra lo siguiente:
1 reporte1 [aqui el combo tenia que salir con el valor pepe]
2 reporte2 [aqui el combo tenia que salir con el valor pepe]
3 reporte3 [aqui el combo tenia que salir con el valor robe]


espero que me entiendan esta vez.
SoftJaén
2008-08-07 05:02:54 UTC
Permalink
Post by yodelmis
El problema es que el combo aparece sin ningun valor seleccionado
ejemplo
1 -- pepe
2 -- robe
3 -- ana
Reporte
1 -- 1 -- reporte1
2 -- 1 -- reporte2
3 -- 2 -- reporte3
1 reporte1 [aqui el combo tenia que salir con el valor pepe]
2 reporte2 [aqui el combo tenia que salir con el valor pepe]
3 reporte3 [aqui el combo tenia que salir con el valor robe]
espero que me entiendan esta vez.
Ahora sí te has explicado estupendamente. :-)

Si la columna de Usuarios no te aparece seleccionado ningún valor (es decir,
el nombre de cualquier usuario de los que aparecen en la lista de elementos
del control ComboBox), es porque una vez rellenado el control DataGridView
has eliminado la fila, y aunque posteriormente la has vuelto a añadir, el
control DataGridView desconoce qué campo del objeto DataTable tiene que
mostrar en la nueva columna añadida, por tanto, tienes que especificar
explícitamente el nombre de la columna mediante la propiedad
«DataPropertyName».

Por ejemplo, si el control DataGridView está enlazado con la tabla de
Reportes, y ésta contiene un campo con el identificador de Usuario o
Registrador llamado «IdUsuario» o «IdRegistrador» o como se llame, campo
éste que también figura en la tabla de Usuarios y es el que relaciona los
registros de ambas columnas, éste será el nombre del campo que deberás de
especificar a la propiedad «DataPropertyName» del control DataGridView:

Cuando añadas la nueva columna, ejecuta lo siguiente:

' Creamos la nueva columna
'
Dim column As New DataGridViewComboBoxColumn
With column
' Especificamos el nombre de la columna que referencia
' al identificador del Usuario o Registrador.
'
.DataPropertyName = "IdRegistrador"

.Name = "IdRegistrador"
.HeaderText = "Nombre Registrador"
.DataSource = objetoDataTableRegistradores
.DisplayMember = "Nombre"
.ValueMember = "Id"
End With

De ésta manera, en la en la "grilla" te deberá de aparecer

1 reporte1 pepe
2 reporte2 pepe
3 reporte3 robe

Espero haberte entendido bien, que creo que sí. :-)
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
yodelmis
2008-08-13 22:48:10 UTC
Permalink
Saludos


"SoftJaén" tenias toda la razon. segui tu ultima recomendacion y todo
pincho (trabajo) OK.

muchas gracias.

Loading...