Ayuda CreateChildView

23/04/2006 - 19:10 por Juan de la Torre | Informe spam
Hola de nuevo
Hace unas horas cerre un post creyendo que ya habia solucionado el problema
pero no es asi. Alberto Poblacion me da la idea para mi aplicacion que
verdaderamente es limpia y elegante con dataview y createchildview pero
despues de varias horas de pruebas no soy capaz de hacerlo funcionar. Mi
aplicacion hace lo siguiente: Tengo un dataset con dos tablas relacionadas.
Una tabla es de Provincias y otra de Poblaciones. Tengo un combo donde cargo
las provincias con un dataview para que me salgan ordenadas y un datagrid
donde cargo las poblaciones relacionadas con la provincia seleccionada. Pero
no soy capaz de hacerlo funcionar si conoceis algun tuto o algun sitio donde
pueda hechar un vistazo os estare agradecido. He mirado otro post que he
encontrado en el foro de Visual basic . net que es algo asi:
Dim vista1 as DataView = dbdataset.Tables("masclientes").DefaultView
Dim fila As DataRowView = vista1(1)
Dim vista2 as DataView = fila.GetChildView(relacionclientes)
datagrid1.datasource = vista2

que porcierto es de Alberto Poblacion tambien, pero no se por donde cogerlo.
Gracias por vuestra paciencia

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
23/04/2006 - 21:28 | Informe spam
"Juan de la Torre" wrote in
message news:
Hace unas horas cerre un post creyendo que ya habia solucionado el
problema
pero no es asi. Alberto Poblacion me da la idea para mi aplicacion que
verdaderamente es limpia y elegante con dataview y createchildview pero
despues de varias horas de pruebas no soy capaz de hacerlo funcionar. Mi
aplicacion hace lo siguiente: Tengo un dataset con dos tablas
relacionadas.
Una tabla es de Provincias y otra de Poblaciones. Tengo un combo donde
cargo
las provincias con un dataview para que me salgan ordenadas y un datagrid
donde cargo las poblaciones relacionadas con la provincia seleccionada.
Pero
no soy capaz de hacerlo funcionar [...]



Ok, vamos por partes.
Si el combo de provincias lo cargas con un DataView, entonces tendrás
algo parecido a esto:

Dim dvProvincias as DataView
...
cmbProvincias.DataSource = dvProvincias

Supongo que quieres cargar el grid de poblaciones cuando cambien la
selección del combo, asi que en el SelectedIndex_Changed pondrás algo
parecido a esto:

Dim drv as DataRowView = dvProvincias(cmbProvincias.SelectedIndex)

Este datarowview representa la fila que te han seleccionado en el
dataview de provincias.
Ahora queremos la vista hija, que vamos a obtener con el
CreateChildView:

Dim dvPoblaciones as DataView
dvPoblaciones = drv.CreateChildView("NombreDelDataRelation")

Y ahora solo tienes que asignar esta vista como origen de datos del
grid:

grdPoblaciones.DataSource = dvPoblaciones


Y eso es todo, si la aplicación es un WinForm. Si es Web habrá que
añadir, como es lógico, el correspondiente DataBind().
Respuesta Responder a este mensaje
#2 Juan de la Torre
24/04/2006 - 17:10 | Informe spam
Alberto gracias por tu respuesta el fallo era que no usaba el selectedindex
del combo. Pero ahora me surge otro problema al usar esta forma de
visualizacion del maestro-detalle, y es el siguiente:
Al elegir una Provincia del combobox evidentemente me salen en un datagrid
perfectamente las poblaciones que esta relacionadas. La aplicacion me da la
opcion de poder añadir poblaciones, asi como borrarlas (solo las
poblaciones). Si por ejemplo yo selecciono la tercera provincia que tiene
como indice 2. y le indico que voy a insertar un nuevo registro, escribo los
datos que son la poblacion y el codigo postal y los grabo. el problema es que
me los graba en el primer registro de provincias. osea como si el combo
estuviera en la primera provincia.

ejemplo: Madrid -- Alcorcon
Madrid

Malaga -- Torrox
Fuengirola

Ahora elijo Malaga para dar de alta Marbella y me sale asi

ejemplo: Madrid -- Alcorcon
Madrid
Marbella

Malaga -- Torrox
Fuengirola

Me pone Marbella en el primer registro que equivale a Madrid.

Gracias por tu tiempo.

"Alberto Poblacion" wrote:

"Juan de la Torre" wrote in
message news:
> Hace unas horas cerre un post creyendo que ya habia solucionado el
> problema
> pero no es asi. Alberto Poblacion me da la idea para mi aplicacion que
> verdaderamente es limpia y elegante con dataview y createchildview pero
> despues de varias horas de pruebas no soy capaz de hacerlo funcionar. Mi
> aplicacion hace lo siguiente: Tengo un dataset con dos tablas
> relacionadas.
> Una tabla es de Provincias y otra de Poblaciones. Tengo un combo donde
> cargo
> las provincias con un dataview para que me salgan ordenadas y un datagrid
> donde cargo las poblaciones relacionadas con la provincia seleccionada.
> Pero
> no soy capaz de hacerlo funcionar [...]

Ok, vamos por partes.
Si el combo de provincias lo cargas con un DataView, entonces tendrás
algo parecido a esto:

Dim dvProvincias as DataView
...
cmbProvincias.DataSource = dvProvincias

Supongo que quieres cargar el grid de poblaciones cuando cambien la
selección del combo, asi que en el SelectedIndex_Changed pondrás algo
parecido a esto:

Dim drv as DataRowView = dvProvincias(cmbProvincias.SelectedIndex)

Este datarowview representa la fila que te han seleccionado en el
dataview de provincias.
Ahora queremos la vista hija, que vamos a obtener con el
CreateChildView:

Dim dvPoblaciones as DataView
dvPoblaciones = drv.CreateChildView("NombreDelDataRelation")

Y ahora solo tienes que asignar esta vista como origen de datos del
grid:

grdPoblaciones.DataSource = dvPoblaciones


Y eso es todo, si la aplicación es un WinForm. Si es Web habrá que
añadir, como es lógico, el correspondiente DataBind().




Respuesta Responder a este mensaje
#3 Alberto Poblacion
24/04/2006 - 20:02 | Informe spam
"Juan de la Torre" wrote in
message news:
Alberto gracias por tu respuesta el fallo era que no usaba el
selectedindex
del combo. Pero ahora me surge otro problema al usar esta forma de
visualizacion del maestro-detalle, y es el siguiente:
Al elegir una Provincia del combobox evidentemente me salen en un datagrid
perfectamente las poblaciones que esta relacionadas. La aplicacion me da
la
opcion de poder añadir poblaciones, asi como borrarlas (solo las
poblaciones). Si por ejemplo yo selecciono la tercera provincia que tiene
como indice 2. y le indico que voy a insertar un nuevo registro, escribo
los
datos que son la poblacion y el codigo postal y los grabo. el problema es
que
me los graba en el primer registro de provincias. osea como si el combo
estuviera en la primera provincia.

ejemplo: Madrid -- Alcorcon
Madrid

Malaga -- Torrox
Fuengirola

Ahora elijo Malaga para dar de alta Marbella y me sale asi

ejemplo: Madrid -- Alcorcon
Madrid
Marbella

Malaga -- Torrox
Fuengirola

Me pone Marbella en el primer registro que equivale a Madrid.



Supongo que en la tabla de poblaciones tendrás un campo IdProvincia que
te indica la provincia a la que pertenece la población. Si estás grabando
desde el grid con un dataadapter, tendrás que revisar qué le has metido al
Insert del dataadapter. Para que todo funcione bien, es necesario que el
Insert grabe en el campo IdProvincia el valor de la provincia que realmente
se ha usado para cargar los datos del grid. Una de dos, o la sacas del combo
y se la pasas a mano al Insert antes de hacer el Update, o reconfiguras el
datatable del grid cada vez que lo cargues para que la columna IdProvincia
tome como Default el valor de la provincia que estás procesando en ese
momento.
Respuesta Responder a este mensaje
#4 Juan de la Torre
24/04/2006 - 21:12 | Informe spam
Gracias Alberto, como teoria esta de escandalo pero soy demasiado novato y
llevo un rato buscando informacion acerta del insert pero no encuentro nada
claro. Si no es mucho abusar y pudieras aportar algo de codigo o en su
defecto algun link donde se explique algo para asi comprenderlo mejor. Muchas
gracias

"Alberto Poblacion" wrote:

"Juan de la Torre" wrote in
message news:
> Alberto gracias por tu respuesta el fallo era que no usaba el
> selectedindex
> del combo. Pero ahora me surge otro problema al usar esta forma de
> visualizacion del maestro-detalle, y es el siguiente:
> Al elegir una Provincia del combobox evidentemente me salen en un datagrid
> perfectamente las poblaciones que esta relacionadas. La aplicacion me da
> la
> opcion de poder añadir poblaciones, asi como borrarlas (solo las
> poblaciones). Si por ejemplo yo selecciono la tercera provincia que tiene
> como indice 2. y le indico que voy a insertar un nuevo registro, escribo
> los
> datos que son la poblacion y el codigo postal y los grabo. el problema es
> que
> me los graba en el primer registro de provincias. osea como si el combo
> estuviera en la primera provincia.
>
> ejemplo: Madrid -- Alcorcon
> Madrid
>
> Malaga -- Torrox
> Fuengirola
>
> Ahora elijo Malaga para dar de alta Marbella y me sale asi
>
> ejemplo: Madrid -- Alcorcon
> Madrid
> Marbella
>
> Malaga -- Torrox
> Fuengirola
>
> Me pone Marbella en el primer registro que equivale a Madrid.

Supongo que en la tabla de poblaciones tendrás un campo IdProvincia que
te indica la provincia a la que pertenece la población. Si estás grabando
desde el grid con un dataadapter, tendrás que revisar qué le has metido al
Insert del dataadapter. Para que todo funcione bien, es necesario que el
Insert grabe en el campo IdProvincia el valor de la provincia que realmente
se ha usado para cargar los datos del grid. Una de dos, o la sacas del combo
y se la pasas a mano al Insert antes de hacer el Update, o reconfiguras el
datatable del grid cada vez que lo cargues para que la columna IdProvincia
tome como Default el valor de la provincia que estás procesando en ese
momento.



Respuesta Responder a este mensaje
#5 Alberto Poblacion
24/04/2006 - 22:00 | Informe spam
"Juan de la Torre" wrote in
message news:
Gracias Alberto, como teoria esta de escandalo pero soy demasiado novato y
llevo un rato buscando informacion acerta del insert pero no encuentro
nada
claro. Si no es mucho abusar y pudieras aportar algo de codigo o en su
defecto algun link donde se explique algo para asi comprenderlo mejor.
Muchas
gracias



Bien, si no sabes que es lo del "Insert", me imagino que no lo habrás
escrito directamente (porque entonces lo conocerías), sino que has usado las
herramientas de diseño para generarlo automáticamente. SI has generado un
DataAdapter con el diseñador visual de Visual Studio, entonces te habrá
escrito automáticamente un fragmento de código fuente que puedes ver
desplegando el "código generado por el diseñador" (en el mismo fichero
fuente del formulario si usas Visual Studio 2002/2003, o en un fichero
separado si usas el 2005). Dentro del código que te ha generado, encontrarás
un fragmento parecido al siguiente:

'
'SqlInsertCommand1
'
Me.SqlInsertCommand1.CommandText = "INSERT INTO
Municipios(IdProvincia, Codigo, Nombre) VALUES (@IdProvincia, @Codigo" & _
", @Nombre); SELECT IdMunicipio, IdProvincia, Codigo, Nombre FROM
Municipios WHER" & _
"E (IdMunicipio = @@IDENTITY)"
Me.SqlInsertCommand1.Connection = Me.SqlConnection1
Me.SqlInsertCommand1.Parameters.Add(New
System.Data.SqlClient.SqlParameter("@IdProvincia",
System.Data.SqlDbType.Int, 4, "IdProvincia"))
Me.SqlInsertCommand1.Parameters.Add(New
System.Data.SqlClient.SqlParameter("@Codigo", System.Data.SqlDbType.VarChar,
8, "Codigo"))
Me.SqlInsertCommand1.Parameters.Add(New
System.Data.SqlClient.SqlParameter("@Nombre", System.Data.SqlDbType.VarChar,
255, "Nombre"))


Como ves, el diseñador ha escrito una sentencia INSERT para grabar datos
en la base de datos, y en algún sitio de la sentencia está metiendo cuál es
la provincia (en el ejemplo anterior es el parámetro @IdProvincia, pero en
tu código probablemente tendrá un nombre distinto).
La sentencia de más abajo, donde hace el Parameters.Add y al final pone
..."IdProvincia" está diciendo que el valor para ese campo hay que tomarlo
de la columna del DataGrid que se llama "IdProvincia". Cuando añades una
línea nueva a tu datagrid, la columna IdProvincia de esa linea nueva no
contiene ningún valor, y recibe el valor que esté establecido por defecto,
con lo cual al final esa linea no te la añade a la provincia que tu quieres.
En resumen, tienes que pasarle a ese campo un valor que sí que sea el Id
de la provincia que estás procesando, para que se pueda grabar en la base de
datos. Hay distintas formas de conseguirlo, pero la más directa que se me
ocurre consiste en meterle directamente el valor antes de hacer la
grabación:

SqlInsertCommand1.Parameters("@IdProvincia").Value =
cmbProvincias.SelectedValue

Lógicamente la linea anterior tendrás que modificarla conforme con el
nombre que el parámetro y el SqlInsertCommand tengan en tu código, y el
valor que tendrás que pasarle será el que realmente quieras grabar en la
base de datos, que a lo mejor no es el cmbProvincias.SelectedValue que te he
puesto como ejemplo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida