ASP.NET - DataTable + GridView

 
Vista:
Imágen de perfil de Tony

DataTable + GridView

Publicado por Tony (5 intervenciones) el 17/06/2016 15:31:22
Saludos, estoy trabajando en una aplicación asp.net desarrollada en C#, en donde tengo una pagina que carga varios registros en un datagridview.

Inicialmente el grid lo cargo se carga con 18 registros, para lo cual utilizo el siguiente código en el evento Page_Load:

1
2
3
4
5
6
7
8
9
10
private void LoadData()
{
	using (clsProveedor cPrv = new clsProveedor())
	{
		dtProveedor = cPrv.ListaProveedores();
	}
 
	this.grvProveedor.DataSource = dtProveedor;
	this.grvProveedor.DataBind();
}

La definición de dtProveedor es la siguiente:
static DataTable dtProveedor = new DataTable();

Tengo luego un botón que me vuelve a cargar el datatable con un filtro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected void imgFiltro_Click(object sender, ImageClickEventArgs e)
{
	if (txtFiltro.Text.Trim().Length > 0)
	{
		using (clsProveedor cProv = new clsProveedor())
		{
			dtProveedor = cProv.ListaProveedores(txtFiltro.Text.Trim());
		}
 
		this.grvProveedor.DataSource = null;
		this.grvProveedor.DataSource = dtProveedor;
		this.grvProveedor.DataBind();
	}
}


En el DataGrid tengo un ButtonField en donde capturo el indice de la fila para posteriormente redireccionar con los datos del registro

1
2
3
4
5
6
7
8
9
10
protected void grvProveedor_RowCommand(object sender, GridViewCommandEventArgs e)
{
	if (e.CommandName == "ModificarProveedor")
	{
		int IndProveedor = Convert.ToInt32(e.CommandArgument);
 
		Response.Redirect("ModificarProveedor.aspx?ProveedorId=" + grvProveedor.Rows[IndProveedor].Cells[1].Text);
 
	}
}


Al aplicar el filtro observo que mi datatable tiene por ejemplo 7 registro, los cuales se visualizan correctamente en la pagina, pero al hacer click nuevamente en el ButtonField inmediatamente el datatable vuelve a cargarse con los 18 registros iniciales, lo cual origina que el indice seleccionad desde el Button no sea el registro deseado.


¿Qué es lo que estoy omitiendo o haciendo mal, y cómo puedo solucionar este inconveniente?


Muchas gracias de antemano.
secuencia-ejecucion
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alexis

DataTable + GridView

Publicado por Alexis (6 intervenciones) el 18/06/2016 08:47:34
Yo pienso que deberías utilizar paneles actualizables, y dentro de este meter tu datagridview, para cuando des click en el boton de tu grid solo acatualice el panel, y no cargue nuevamente toda lapagina, para esto tendrás que configurar este panel, y que se active solo con los controles que tu le indiques, te muestro un poco de mi código, y te dejo un enlace, en el que vienen mas a cerca de los paneles actualizables
2016-06-18-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//este boton hará que el panel se actualice cada que lo pulse
<asp:Button ID="btn_update_news" runat="server" Text="Actualizar noticias" CssClass="btn btn-default" Style="width: 100%; margin-bottom: 15px;"  OnClick="btn_update_Click" />
 
                //este es el panel actualizable
                <asp:UpdatePanel ID="pnl_noticias" runat="server" UpdateMode="Conditional">
                    <ContentTemplate>
                        //dentro de este ContentTemplate va a ir tu datagridview :)
                        <asp:Panel ID="pnl_principal" runat="server">
                        </asp:Panel>
                    </ContentTemplate>
                    //dentro de estas etiquetas irán los controles que van a actualizar el panel, con el evento que le indiques
                    <Triggers>
                        //en este caso es el boton que está declarado al inicio, pero podrías poner el botón de tu grid o el que utilices para hacer el filtro, obviamente con el evento que este produce
                        <asp:AsyncPostBackTrigger ControlID="btn_update_news" EventName="Click" />
                    </Triggers>
                </asp:UpdatePanel>

y este es el código C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
protected void Page_Load(object sender, EventArgs e)
        {
 
            //if (!IsPostBack)
            //{
                user_actual = user_actual == null ? (Cuenta)Session["cuenta"] : user_actual;
                if (user_actual != null)
                {
                    LoadNoticias();
                    LoadUsers();
                    ViewData();
                }
                else
                {
                    Response.Redirect("~/", true);
                }
            //}
 
 
        }
 
private void LoadNoticias()
        {
            List<Publicacion> lst_publicacion = new List<Publicacion>();// = dc.GetTable<Publicacion>().OrderByDescending(p => p.fecha_publicacion).ToList();//this.listPublicacion.OrderByDescending(c => c.Fecha).ToList();
            List<Lista_Amigos> lst_friend = this.dc.GetTable<Lista_Amigos>().Where(c => c.usuario_id == user_actual.usuario_id || c.contacto_id==user_actual._id).ToList();
 
            foreach (var item in lst_friend)
            {
                List<Publicacion> lst_publ_by_user = this.dc.GetTable<Publicacion>().Where(c => c.usuario_id == item._id || c.usuario_id == user_actual.usuario_id).ToList();
                foreach (var publicacion in lst_publ_by_user)
                {
                    lst_publicacion.Add(publicacion);
                }
            }
            if (lst_publicacion.Count > 0)
            {
                lst_publicacion.OrderByDescending(c => c.fecha_publicacion);
 
                foreach (var item in lst_publicacion)
                {
                    Panel panel_parent = new Panel();
                    panel_parent.CssClass = "panel panel-default";
 
                    Panel panel_body = new Panel();
                    panel_body.CssClass = "panel-body";
 
                    Image img_usuario = new Image();
                    img_usuario.CssClass = "img-circle user-image img-responsive";
                    img_usuario.Width = Unit.Pixel(15);
                    img_usuario.Height = Unit.Pixel(15);
 
                    Literal cont = new Literal();
 
                    cont.Text = ""
                        + "<img src='/Pictures/Perfil/f3.png' class='img-circle user-image img-responsive' style='width:45px; height:45px;display: inline'/>"
                        + "<h4 style='display: inline;margin-left:15px;'>"
                        + "<a href='#'>" + item.Usuario.nombe + " " + item.Usuario.ap_paterno + " " + item.Usuario.ap_materno + "</a>"
                        + "</h4>"
                        + "<hr style='margin:5px 0'/>"
                        + "<p>" + item.publicacion1 + "</p>"
                        + "<p class='text-right text-muted'>Publicado: " + item.fecha_publicacion + "</p> ";
 
                    panel_body.Controls.Add(cont);
                    panel_parent.Controls.Add(panel_body);
                    this.pnl_principal.Controls.Add(panel_parent);
                    this.pnl_noticias.Update();
                }


https://msdn.microsoft.com/es-es/library/cc295400.aspx
https://msdn.microsoft.com/en-us/library/bb399001.aspx

Espero que te halla servido de algo :D
Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

DataTable + GridView

Publicado por Esmeralda (19 intervenciones) el 19/06/2016 08:45:16
Yo lo aplico de la siguiente forma
1.- llenado del grid con botones
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
protected void dgvPersona_RowCommand(object sender, GridViewCommandEventArgs e)
{
	try
	{
		DataContext dcTempo = new DCGeneralDataContext();
		if(e.CommandName.Equals("Consulta"))
		{
			int idd = Convert.ToInt32(e.CommandArgument.ToString());
 
			Persona per = dcTempo.GetTable<Persona>().First(c => c.Id == idd);
			String id = Convert.ToString(per.Id);
			this.txtId.Text = id;
			this.txtClave.Text = per.strClaveUnica;
			this.txtNombre.Text = per.strNombre;
			this.txtAP.Text = per.strAPaterno;
			this.txtAM.Text = per.strAMaterno;
			this.dblSexo.SelectedIndex = (per.IdCatSexo == 1) ? 1 : 2;
			this.ViewState["idPersona"] = per.Id;
			return;
 
		}
		if (e.CommandName.Equals("Eliminar"))
		{
			int idd = Convert.ToInt32(e.CommandArgument.ToString());
			Persona perEliminar = dcTempo.GetTable<Persona>().First(c => c.Id == idd);
			dcTempo.GetTable<UTTT.ESMERALDA.Data.Entity.Direccion>().DeleteAllOnSubmit(perEliminar.Direccion);
			dcTempo.GetTable<Persona>().DeleteOnSubmit(perEliminar);
			dcTempo.SubmitChanges();
 
			this.setGridView();
			this.idPersona = 0;
			this.limpiar();
			return;
		}
		if (e.CommandName.Equals("Direccion"))
		{
			Session["Id"] = txtId.Text;
			this.session.Pantalla = this.pantalla;
			Response.Redirect(this.session.Pantalla);
		}
	}
	catch (Exception _e)
	{
		Response.Write("Error " + _e.Message);
	}
}



2.- Despues se crea un metodo para empezar el llenado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void setGridView()
{
	try
	{
		DataContext temp = new DCGeneralDataContext();
		List<Persona> listaPersona = temp.GetTable<Persona>().ToList();
		this.dgvPersona.DataSource = listaPersona;
		this.dgvPersona.DataBind();
	}
	catch(Exception _e)
	{
		Response.Write("Error " + _e.Message);
	}
}


3.- Se manda a llamar el metodo el el page load para que se actualice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected void Page_Load(object sender, EventArgs e)
{
	//Decir que antes de que carga la pagina cargar el contenido
	if (!IsPostBack)
	{
		try
		{
			this.setGridView();
		}
		catch (Exception _e)
		{
			Response.Write("Error " + _e.Message);
		}
 
	}
 
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

DataTable + GridView

Publicado por khristian (83 intervenciones) el 28/06/2016 15:24:53
NO lei todo tu cuento,. pero... llegue hasta donde dices que se te vuelven a cargar los registros al hacer clic en un boton.

Claro que se te cargan... si estas usando un botón que hace postback. Además, tienes el el page load la carga de todo los registros.

Debes usar un control para redireccionar que no haga postback.

Si haces postback, debes volver a aplicar el filtro.

Yo por lo general, para hace dirección a otra pagina al hacer clic en una fila del gridview, lo que hago es crear una columna de hipervinculo... Ya sea automatica del gridview, o a html puro... solo desde tu clase recibe la url (previamente creada, ya sea en la clase, o el el SGBD)

Por ejemplo:

SELECT id, nombre, 'http://www.miweb.com/informe.aspx?id='+id as url FROM listado

Entonces... recibes en tu resultado el link listo para llevar al usuario a la pagina de detalle, edición, o lo que sea...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar