ComboBox y DataSet

27/01/2006 - 12:06 por Oscar M | Informe spam
Hola a todos,

uno de mis formularios tiene un datagridview y 20 combobox para realizar
filtros a la selección.

Para rellenar la lista de los combobox (Cada uno de ellos con un campo de la
tabla) he creado un enlace a datos para cada uno de ellos, modificandoles
luego el SQL para hacer un Distinct de cada elemento.

Pero claro esto me ha creado en mi formulario 20 DataSet, 20 bindingsourcer
y 20 Tableadapter.

¿Hay alguna solución mas eficiente?

Muchas gracias.

Un saludo

Oscar M

PD: se ha perdido la estupenda costumbre del [POR FIN ES VIERNES] ???????

Preguntas similare

Leer las respuestas

#1 A.Poblacion
27/01/2006 - 19:55 | Informe spam
"Oscar M" wrote in message
news:%
uno de mis formularios tiene un datagridview y 20 combobox para realizar
filtros a la selección.

Para rellenar la lista de los combobox (Cada uno de ellos con un campo de
la tabla) he creado un enlace a datos para cada uno de ellos,
modificandoles luego el SQL para hacer un Distinct de cada elemento.

Pero claro esto me ha creado en mi formulario 20 DataSet, 20
bindingsourcer y 20 Tableadapter.

¿Hay alguna solución mas eficiente?



Es más eficiente cargarlos con un datareader, en lugar de un dataadapter
más un dataset. Si el formulario es Web, puedes poner el DataReader como
DataSource del combo. Si es un Winform, no puedes poner el datareader como
datasource, pero sí puedes escribir una pequeña subrutina que reciba como
argumentos el combo y el datareader y que haga un pequeño bucle leyendo el
datareader y metiendo cada linea en el combo. De esta manera te saltas un
paso respecto al dataadapter, ya que éste utiliza internamente un bucle
leyendo de un datareader para traer los datos al dataset, y luego el
databinding usa otro bucle para copiarlos del dataset al combo.

Si quieres añadir una optimización más, mete los 20 selects en un
procedimiento almacenado, ejecuta la llamada al procedimiento con un
ExecuteReader de un SqlCommand, y usa el método NextResult() del DataReader
para ir saltando de un resultado a otro. De esta forma haces una sola
llamada al servidor de base de datos, en lugar de 20.
Respuesta Responder a este mensaje
#2 Oscar M
27/01/2006 - 20:18 | Informe spam
Ok, lo intentaré como dices...

La idea, si no lo he entendido mal, es crear una rutina que reciba el
Combobox (que no estará asociado a ninguna dataset, unbound) y rellene su
lista buscando en el dataset del DateGridView.

Creo que servirá para dotar a mi formulario de las funcionalidades que
deseo.

Muchas gracias.

Un saludo... Y a pasarlo bien que es viernes...

byebye


"A.Poblacion" escribió en
el mensaje news:
"Oscar M" wrote in message
news:%
uno de mis formularios tiene un datagridview y 20 combobox para realizar
filtros a la selección.

Para rellenar la lista de los combobox (Cada uno de ellos con un campo de
la tabla) he creado un enlace a datos para cada uno de ellos,
modificandoles luego el SQL para hacer un Distinct de cada elemento.

Pero claro esto me ha creado en mi formulario 20 DataSet, 20
bindingsourcer y 20 Tableadapter.

¿Hay alguna solución mas eficiente?



Es más eficiente cargarlos con un datareader, en lugar de un dataadapter
más un dataset. Si el formulario es Web, puedes poner el DataReader como
DataSource del combo. Si es un Winform, no puedes poner el datareader como
datasource, pero sí puedes escribir una pequeña subrutina que reciba como
argumentos el combo y el datareader y que haga un pequeño bucle leyendo el
datareader y metiendo cada linea en el combo. De esta manera te saltas un
paso respecto al dataadapter, ya que éste utiliza internamente un bucle
leyendo de un datareader para traer los datos al dataset, y luego el
databinding usa otro bucle para copiarlos del dataset al combo.

Si quieres añadir una optimización más, mete los 20 selects en un
procedimiento almacenado, ejecuta la llamada al procedimiento con un
ExecuteReader de un SqlCommand, y usa el método NextResult() del
DataReader para ir saltando de un resultado a otro. De esta forma haces
una sola llamada al servidor de base de datos, en lugar de 20.



Respuesta Responder a este mensaje
#3 A.Poblacion
27/01/2006 - 23:08 | Informe spam
"Oscar M" wrote in message
news:
La idea, si no lo he entendido mal, es crear una rutina que reciba el
Combobox (que no estará asociado a ninguna dataset, unbound) y rellene su
lista buscando en el dataset del DateGridView.



No, lo has entendido mal. La idea es llenar los combobox _prescindiendo_
por completo de usar DataSets, y usar en su lugar DataReaders. Algo asi:

SqlCommand cmd = new SqlCommand("Select Campo from Tabla1", conexion);
conexion.Open();
SqlDataReader rdr = cmd.ExecuteReader();
dropdownlist1.Items.Clear();
while (rdr.Read())
{
dropdownlist1.Items.Add(rdr[0]);
}
conexion.Close();

Este trozo de código habría que repetirlo 20 veces, una por cada combo.
Para no escribir tanto es por lo que decía yo lo de escribir una subrutina
con el bucle y llamarla 20 veces.
Obviamente el combo estará "unbound", y se cargará de datos metiendo este
código en el form_load.
Respuesta Responder a este mensaje
#4 Oscar M
28/01/2006 - 19:05 | Informe spam
Ahora si que lo he entendido, muchas gracias, tiene mucha mejor pinta que lo
que yo decía.
Lo voy a intentar..

Un saludo.

Oscar

"A.Poblacion" escribió en
el mensaje news:
"Oscar M" wrote in message
news:
La idea, si no lo he entendido mal, es crear una rutina que reciba el
Combobox (que no estará asociado a ninguna dataset, unbound) y rellene su
lista buscando en el dataset del DateGridView.



No, lo has entendido mal. La idea es llenar los combobox
_prescindiendo_ por completo de usar DataSets, y usar en su lugar
DataReaders. Algo asi:

SqlCommand cmd = new SqlCommand("Select Campo from Tabla1", conexion);
conexion.Open();
SqlDataReader rdr = cmd.ExecuteReader();
dropdownlist1.Items.Clear();
while (rdr.Read())
{
dropdownlist1.Items.Add(rdr[0]);
}
conexion.Close();

Este trozo de código habría que repetirlo 20 veces, una por cada combo.
Para no escribir tanto es por lo que decía yo lo de escribir una subrutina
con el bucle y llamarla 20 veces.
Obviamente el combo estará "unbound", y se cargará de datos metiendo
este código en el form_load.



Respuesta Responder a este mensaje
#5 Oscar M
28/01/2006 - 20:56 | Informe spam
Estupendo, lo he probado y funciona perfectamente, solo he tenido que
cambiar SQL por OLEDB, ya que yo utilizo bases de datos de Access...

Muchas Gracias de nuevo...

"A.Poblacion" escribió en
el mensaje news:
"Oscar M" wrote in message
news:
La idea, si no lo he entendido mal, es crear una rutina que reciba el
Combobox (que no estará asociado a ninguna dataset, unbound) y rellene su
lista buscando en el dataset del DateGridView.



No, lo has entendido mal. La idea es llenar los combobox
_prescindiendo_ por completo de usar DataSets, y usar en su lugar
DataReaders. Algo asi:

SqlCommand cmd = new SqlCommand("Select Campo from Tabla1", conexion);
conexion.Open();
SqlDataReader rdr = cmd.ExecuteReader();
dropdownlist1.Items.Clear();
while (rdr.Read())
{
dropdownlist1.Items.Add(rdr[0]);
}
conexion.Close();

Este trozo de código habría que repetirlo 20 veces, una por cada combo.
Para no escribir tanto es por lo que decía yo lo de escribir una subrutina
con el bucle y llamarla 20 veces.
Obviamente el combo estará "unbound", y se cargará de datos metiendo
este código en el form_load.



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