maestro detalle datagrids - tabcontrol

07/12/2005 - 04:10 por Pablo | Informe spam
Hola Gente,

tengo el siguiente problema :
Necesito construir en un winform una estructura maestro detalle.
Tengo un tabcontrol con dos tabs, cada uno con un datagrid.

Me pueden orientar en cual seria la forma mas eficaz de relacionar
los dos datagrid de manera que se comporten uno como maestro y el otro
como detalle. La idea seria que al hacer click en una fila del primer
datagrid en el primer tab se actualize el datagrid del segundo tab segun
una relacion dada por una sentencia sql del tipo

select * from tabla_detalle
where clave=clave_maestra

y que el datagrid se actualize al momento de hacer click en la primera,
ya sea con el evento click o el mousedown.

Ya estuve tratando con datarelation pero no me resultaron, el asunto es que
este ejemplo es de muestra nomas porque en realidad la relacion es un padre
con varios hijos y algunos hijos con nietos, y con datarelation no lo pude
implementar.

saludos,
y gracias por adelantado

Preguntas similare

Leer las respuestas

#1 SoftJaén
07/12/2005 - 19:50 | Informe spam
"Pablo" preguntó:

Me pueden orientar en cual seria la forma mas eficaz de relacionar
los dos datagrid de manera que se comporten uno como maestro y el otro
como detalle.



Hola, Pablo:

Para construir un formulario maestro/detalle, básicamente los pasos serían
los siguientes:

1. Declarar a nivel del formulario un objeto DataSet:

Private ds As New DataSet

2. En un procedimiento cualquiera, establecer una conexión con el origen de
datos, utilizando el proveedor .net adecuado, en el ejemplo, el proveedor
.net para Microsoft Access:

Dim cnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos\Bd1.mdb")

cnn.Open()

3. Crear un adaptador de datos para la tabla Maestro:

Dim daMaestro As New OleDbDataAdapter(ConsultaSQL, cnn)

4. Rellenar el objeto DataSet con los datos de la tabla Maestro:

daMaestro.Fill(ds, "TablaMaestro")

5. Crear un segundo adaptador de datos para la tabla Detalle:

Dim daDetalle As New OleDbDataAdapter(ConsultaSQL, cnn)

6. Rellenar el objeto DataSet con los datos de la tabla Detalle:

daDetalle.Fill(ds, "TablaDetalle")

7. Crear una relación entre ambas tablas:

ds.Relations.Add("NombreRelacion", _
ds.Tables("TablaMaestro").Columns("CampoRelacion"), _
ds.Tables("TablaDetalle").Columns("CampoRelacion"))

8. Enlazar los distintos DataGrid con el objeto DataSet:

DataGrid1.DataSource = ds
DataGrid1.DataMember = "TablaMaestro"
DataGrid1.AllowNavigation = False

DataGrid2.DataSource = ds
DataGrid2.DataMember = "TablaMaestro.NombreRelacion"

9. Cerrar la conexión:

cnn.Close()

Eso es todo. Cada vez que selecciones un registro en el control DataGrid
"maestro", te aparecerán los registros relacionados en el control DataGrid
"detalle". Adapta el código a tus necesidades.

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.
Respuesta Responder a este mensaje
#2 SoftJaén
07/12/2005 - 20:00 | Informe spam
Bueno, ahora que lo pienso, tampoco hace falta declarar a nivel del
formulario el objeto DataSet. Si dicho objeto no lo vas a utilizar en ningún
otro procedimiento, puedes declararlo en el mismo procedimiento donde vas a
ejecutar todo el código.

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.
Respuesta Responder a este mensaje
#3 Pablo
13/12/2005 - 03:56 | Informe spam
Hola Enrique,

todo ok hasta aqui.
Ahora la pregunta es como hago para que en la grilla con las filas detalle
no me aparezca el asterisco ("*") en la ultima fila. Mi idea es solo edjarle
al usuario
agregar registros cuando yo quiera segun unas ciertas condiciones.
Lo que hago es:
en la gruilla maestra:

PQA.Grid.DataSource = lDSetA.Tables(IS_TBL_ASSETS)

y en una de las relacionadas (son cuatro)

PQL.Grid.DataSource = lDSetA.Tables(IS_TBL_ASSETS)
PQL.Grid.DataMember = "AssetsLocations"

En la grilla maestra puedo evitar la ultima fila con asterisco
poniendo:

lDSetA.Tables(IS_TBL_ASSETS).DefaultView.AllowNew = False

pero si hago algo similar con la grilla detalle no tiene efecto,
no importa lo que ponga, siempre me aparece la posibilidad
de agregar filas a la grilla.

Yo quiero poner un boton "nuevo registro" en la toolbar y que solo
se agregue un registro pulsando ese boton, no con el mouse en la grilla
se entiende?

gracias por adelantado,
Pablo





"SoftJaén" escribió en el mensaje
news:u7cqM81%
"Pablo" preguntó:

Me pueden orientar en cual seria la forma mas eficaz de relacionar
los dos datagrid de manera que se comporten uno como maestro y el otro
como detalle.



Hola, Pablo:

Para construir un formulario maestro/detalle, básicamente los pasos serían
los siguientes:

1. Declarar a nivel del formulario un objeto DataSet:

Private ds As New DataSet

2. En un procedimiento cualquiera, establecer una conexión con el origen
de
datos, utilizando el proveedor .net adecuado, en el ejemplo, el proveedor
.net para Microsoft Access:

Dim cnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos\Bd1.mdb")

cnn.Open()

3. Crear un adaptador de datos para la tabla Maestro:

Dim daMaestro As New OleDbDataAdapter(ConsultaSQL, cnn)

4. Rellenar el objeto DataSet con los datos de la tabla Maestro:

daMaestro.Fill(ds, "TablaMaestro")

5. Crear un segundo adaptador de datos para la tabla Detalle:

Dim daDetalle As New OleDbDataAdapter(ConsultaSQL, cnn)

6. Rellenar el objeto DataSet con los datos de la tabla Detalle:

daDetalle.Fill(ds, "TablaDetalle")

7. Crear una relación entre ambas tablas:

ds.Relations.Add("NombreRelacion", _
ds.Tables("TablaMaestro").Columns("CampoRelacion"), _
ds.Tables("TablaDetalle").Columns("CampoRelacion"))

8. Enlazar los distintos DataGrid con el objeto DataSet:

DataGrid1.DataSource = ds
DataGrid1.DataMember = "TablaMaestro"
DataGrid1.AllowNavigation = False

DataGrid2.DataSource = ds
DataGrid2.DataMember = "TablaMaestro.NombreRelacion"

9. Cerrar la conexión:

cnn.Close()

Eso es todo. Cada vez que selecciones un registro en el control DataGrid
"maestro", te aparecerán los registros relacionados en el control DataGrid
"detalle". Adapta el código a tus necesidades.

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.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida