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

Filtro de un DataView y DataGrid

Estas en el tema de Filtro de un DataView y DataGrid en el foro de .NET en Foros del Web. Tengo la siguiente estrutura en un formulario A la izquierda un treeview A la derecha un DataGrid Sobre el DataGrid varios objetos tipo text -Al ...
  #1 (permalink)  
Antiguo 08/09/2005, 09:40
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Filtro de un DataView y DataGrid

Tengo la siguiente estrutura en un formulario

A la izquierda un treeview
A la derecha un DataGrid
Sobre el DataGrid varios objetos tipo text

-Al cargar el formulario se ejecuta un sp que llena los datos de la Grid
a traves de DataSet y un DataView

-Al dar clic en la Grid lleva los datos a los objetos tipo text.

-Al dar clic en los nodos de tercer nivel se filtran los datos y se muestran en la data grid, pero al dar clic en la grid ya no lleva los datos correctamente a los textos, Al dar clic en la grid no esta leyendo los datos cuando se aplico el filtro, toma los datos que se asignaron a la grid en el load del formulario, esta es la linea que uso para leer los datos

Código:
DataView.Table.Rows[DataGrid.CurrentRowIndex][0].ToString();
Gracias
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #2 (permalink)  
Antiguo 08/09/2005, 13:39
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
como haces el filtro?

el dataset es miembro de tu forma?
  #3 (permalink)  
Antiguo 08/09/2005, 13:49
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
El DataSet es creado por codigo.

Código:
Dataset dsDatos = new Dataset();
DataView dvFiltro = new DataView(dsDatos.Tables[0]);
DataGrid.DataSource=dvFiltro;
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #4 (permalink)  
Antiguo 08/09/2005, 14:08
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
pero los creas en una funcion o son parte de la clase? (dataset y dataview)
  #5 (permalink)  
Antiguo 08/09/2005, 14:31
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Son parte de la clase
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #6 (permalink)  
Antiguo 08/09/2005, 14:49
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Para aplicar el filtro deberia seria ser algo como :

Código:
DataView dvFiltro = new DataView(dsDatos.Tables[0]); // Se asigna la vista default
dvFiltro.RowFilter = "micampo = mivalor";  // Aplicar el filtro deseado
DataGrid.DataSource=dvFiltro;
  #7 (permalink)  
Antiguo 08/09/2005, 15:05
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Si, eso me funciona, pero tratare de explicarlo nuevamente para que me entiendas mas facil lo que me pasa.

En el load del formulario ejecuto un sp, este trae todos los datos de la tabla y hago lo siguiente

Código:
 Dataset dsDatos = new Dataset();
DataView dvFiltro = new DataView(dsDatos.Tables[0]);
DataGrid.DataSource=dvFiltro;
Al dar clic en un registro el me lleva los datos a los text que se encuentran arriba de la grid

Luego en el treeview al dar clic en un nodo de ultimo nivel me filtra segun en parametro, y asigno el filtro a la DataGrid, asi que ya no veo todos los datos, solo los filtrados eso me funciona.

Pero al dar clic en la grid no lleva los datos que se estan viendo en la grid, los filtrados, lleva los que estaban antes de hacer el filtro, es decir lo que se vieron inicialmente en el load del formulario.

¿Esta mas claro?

Gracias por tu ayuda
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #8 (permalink)  
Antiguo 08/09/2005, 15:10
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
ok, entonces cual es el code de cuando haces click... en el grid...
  #9 (permalink)  
Antiguo 08/09/2005, 15:20
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Código:
string numeroCalidad = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][0].ToString();
string codigo = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][1].ToString();
string valor = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][2].ToString();

DataSet dsDatosNumero = new DataSet();
		 dsDatosNumero=Procedimiento("3",codigo,valor,null,numeroCalidad,Convert.ToBoolean(0),CGlobal.gEstacion.Usuario,"Consultar Datos","Se consultaron los datos",0,"0","0");
		        txtNCal.Text=dsDatosNumero.Tables[0].Rows[0]["nroNC"].ToString();
		        txtValor.Text=dsDatosNumero.Tables[0].Rows[0]["valNroCal"].ToString();
		 txtDescripcion.Text=dsDatosNumero.Tables[0].Rows[0]["strDescripcion"].ToString();
		 chkActivo.Checked=Convert.ToBoolean(dsDatosNumero.Tables[0].Rows[0]["bolActivo"].ToString());
Reemplaze estas lineas

Código:
 string numeroCalidad = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][0].ToString();
string codigo = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][1].ToString();
string valor = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][2].ToString();
Por estas

Código:
string numeroCalidad = dvFiltro.Table.Rows[dtgDatos.CurrentRowIndex][0].ToString();
string codigo = dvFiltro.Table.Rows[dtgDatos.CurrentRowIndex][1].ToString();
string valor=dvFiltro.Table.Rows[dtgDatos.CurrentRowIndex][2].ToString();
Pense que al colocar

dvFiltro.Table.Rows[dtgDatos.CurrentRowIndex][2].ToString()

Haria referecia a la vista, pero no funciono
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #10 (permalink)  
Antiguo 08/09/2005, 15:49
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
El dataset "ds" de donde sale... ya que en el code anterior habia uno llamado dsDatos... que eran los que se cargaban en el Load...


Bueno....lo que parece es que te estas apuntando al dataset que cargaste en un inicio...cuando deberias referirte a un dataset filtrado... o bien a la vista... dvFiltro ya que ahi es donde esta la info actualizada... y los indices corresponderan con el datagrid...
  #11 (permalink)  
Antiguo 08/09/2005, 16:01
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Código:
DataSet dsFiltrar = new DataSet();
dsFiltrar = SqlHelper.ExecuteDataset(Configuracion.Cn,CommandType.Text,
		 		"SELECT nroNC FROM tblsysGHNroCalidad WHERE strGrupo='"+tvwArbol.SelectedNode.Text+"'");
FiltroNroCalidad=dsFiltrar.Tables[0].Rows[0][0].ToString();
dvFiltro.RowFilter="nroNC='"+FiltroNroCalidad+"'";
dtgDatos.DataSource=dvFiltro;
El dsFiltar lo uso para averiguar por cual datos se filtra el DataView dvFiltrar, pero sigue trabajando con ds ¿o no?


__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)

Última edición por jhonwilliams; 08/09/2005 a las 16:05 Razón: Me sobraba un comentario
  #12 (permalink)  
Antiguo 08/09/2005, 16:13
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Orales ya salio otro dataset mas....

yo me referia a este... ds ->> ds.Tables[0]....


Código:
string numeroCalidad = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][0].ToString();
string codigo = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][1].ToString();
string valor = ds.Tables[0].Rows[dtgDatos.CurrentRowIndex][2].ToString();

Y bueno aqui parece que vuelves lees desde la bd.... para obtener el valor a filtrar...y es hacia la vista donde debes apuntar no al dataset que cargaste en load ("ds")

Código:
DataSet dsFiltrar = new DataSet();
dsFiltrar = SqlHelper.ExecuteDataset(Configuracion.Cn,CommandT  ype.Text,
		 		"SELECT nroNC FROM tblsysGHNroCalidad WHERE strGrupo='"+tvwArbol.SelectedNode.Text+"'");
FiltroNroCalidad=dsFiltrar.Tables[0].Rows[0][0].ToString();
dvFiltro.RowFilter="nroNC='"+FiltroNroCalidad+"'";
dtgDatos.DataSource=dvFiltro;
  #13 (permalink)  
Antiguo 08/09/2005, 16:18
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Adicionalmente...para ahorrar una vuelta a la BD.. puedes cargar el arbol tambien con el valor del filtro...el numero que obtienes y almacenas en dsFiltrar...(strGrupo)

Al cargar el arbol puedes traerte los dos valores, el texto y el numero...el texto lo almacenas en la propiedad Text y el valor en la propiedad Tag...


luego para acceder a Tag es igual...solo ponle .ToString() y listo...

tvwArbol.SelectedNode.Tag.ToString();
como ves?


  #14 (permalink)  
Antiguo 09/09/2005, 06:54
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Creeme que intente hacer eso del tag, pero no me funcino, cuando creo lo nodos escribia algo como esto

Este codigo crea los nodos y asigna el tag.(Esto funciono)

Código:
TreeNode Nodoz = nodoPadre.Nodes.Add(drow[0].ToString());
string ultimocaracter =Nodoz.ToString().Substring(Nodoz.ToString().Length-1,1).ToString();
dv.RowFilter="intNodoPadre="+ultimocaracter+"";
foreach(DataRowView drw in dv)
{
   Nodoz.Nodes.Add(drw[2].ToString());
    Nodoz.Tag=drw[1].ToString();
}
Ahora si, recuerdas el codigo que me pasaste para averiguar el ultimo nodo.

Yo lo utilize asi:

Código:
TreeNode elnodo= tvwArbol.SelectedNode;
 if (elnodo.Nodes.Count==0)
{
DataSet dsFiltrar = new DataSet();
dsFiltrar = SqlHelper.ExecuteDataset(Configuracion.Cn,CommandType.Text,
		 		"SELECT nroNC FROM tblsysGHNroCalidad WHERE strGrupo='"+tvwArbol.SelectedNode.Text+"'");
FiltroNroCalidad=dsFiltrar.Tables[0].Rows[0][0].ToString();
//Linea para probar el tag del Nodo.
 MessageBox.Show(elnodo.Tag.ToString());
dvFiltro.RowFilter="nroNC='"+FiltroNroCalidad+"'";
}
Pero me sale la siguiente exception

Código:
Object reference not set to an instance of an reference
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #15 (permalink)  
Antiguo 10/09/2005, 08:32
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Listo lo del filtro

Para todos los que tengan un problama similar, deben traer los datos desde el datagrid y no desde el DataSet o DataView, como estaba intentandolo yo.

Esta es la linea de ejemplo.

Código:
TExto1.Text= dtgDatos[dtgDatos.CurrentRowIndex,0].ToString();


Andres95, Muchas gracias por tu ayuda.
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #16 (permalink)  
Antiguo 10/09/2005, 11:54
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Cita:
Iniciado por jhonwilliams
Creeme que intente hacer eso del tag, pero no me funcino, cuando creo lo nodos escribia algo como esto

Este codigo crea los nodos y asigna el tag.(Esto funciono)

Código:
TreeNode Nodoz = nodoPadre.Nodes.Add(drow[0].ToString());
string ultimocaracter =Nodoz.ToString().Substring(Nodoz.ToString().Length-1,1).ToString();
dv.RowFilter="intNodoPadre="+ultimocaracter+"";
foreach(DataRowView drw in dv)
{
   Nodoz.Nodes.Add(drw[2].ToString());
    Nodoz.Tag=drw[1].ToString();
}

Perdon... pero ayer me fue imposible conectarme a inter... ya que no estuve en la ofix...

pero bueno... revizando tu code...y abusando de tu confianza...te comento que creo que hay algunas cosillas fuera de orden... mira:

Código:
//Aqui agregas un nodo en el nodo padre...con info de un row...ok
TreeNode Nodoz = nodoPadre.Nodes.Add(drow[0].ToString());

//Pero aqui que info obtienes?
//Yo creo que el Nodoz.ToString() .... debe ser reemplazado por un Nodoz.Text ...
//ya que el ToString te trae la representacion string del objecto...y aunque ahorita no 
//tengo como verificarlo...creo que no necesariamente debe traerte el text del nodo...
//lo checo hoy y te comento el lunes...
string ultimocaracter =Nodoz.ToString().Substring(Nodoz.ToString().Length-1,1).ToString();

//aqui va el filtro... ok
dv.RowFilter="intNodoPadre="+ultimocaracter+"";


foreach(DataRowView drw in dv)
{

   //Pero aqui si sr... aqui se te olvidó mantener la referencia del objeto...
   //deberia estar algo como en la agregacion que haces arriba...
   // ( TreeNode miNodoNuevo =Nodoz.Nodes.Add(drw[2].ToString()) )
   // y luego a ese nodo nuevo... le actualizas la propiedad Tag..
   // seria algo como :
   // miNodoNuevo.Tag = drw[1].ToString(); 
   // ya que en la sentencia que tienes... estas actualizando el tag pero del padre.. osea de "Nodoz".
   // y pues es comprensible que luego te salga un NullException  ya que el unico que tiene tag 
   // es el padre de todos los nodos...

    Nodoz.Nodes.Add(drw[2].ToString());
   Nodoz.Tag=drw[1].ToString();
}
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 19:07.