lunes, 9 de febrero de 2009

ASP.NET - Refrescado automatico de multiples secciones de pagina

timer En el post anterior explicamos cómo podemos hacer para que una sección de página ( no toda la página ) se autorefresque automáticamente cada x tiempo.
En este post vamos a extender un poquito la funcionalidad y vamos a demostrar lo simple que resulta refrescar múltiples secciones de página de manera automática.

Cada sección de página que queremos refrescar debe estar dentro de un updatepanel, y para el refrescado automático de todas las secciones usamos 1 único control Timer de ASP.NET AJAX.

Ojo: Si quisiéramos que las secciones no se refresquen al mismo tiempo, osea que una sección se refresque cada 5 minutos y que otra sección se refresque cada 3 minutos habría que usar dos controles Timer.

Nuestro ejemplo consiste en refrescar dos secciones de la misma página... y necesitamos lo sgte:
1.- un scriptmanager.
2.- un control Timer.
2.- updatepanel1 y updatepanel2
UpdatePanel1 tendrá un gridview y updatepanel2 tendrá un simple Label que mostrará la hora del servidor

3.- un AsyncPostBackTrigger para cada updatepanel, que es el control que precisamente sirve como nexo con el timer.

y este sería el código aspx:

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Timer ID="Timer1" Interval="4000" runat="server" OnTick="Timer1_Tick">
</asp:Timer>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="gridUsers" runat="server">
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" />
</Triggers>
</asp:UpdatePanel>
<br />
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" />
</Triggers>
</asp:UpdatePanel>
</form>

Luego, veamos el código que va en el code beside (Por favor lean este post anterior que casi es el mismo código y explica más detallado esta parte):

protected void Timer1_Tick(object sender, EventArgs e)
{
GetUsers();
Label1.Text = "La hora del servidor es:" +
DateTime.Now.ToLongTimeString();
}

private void GetUsers()
{
Random r = new Random();
int Quantity = r.Next(1, 10);

List<User> users = new List<User>();
for (int i=1; i<=Quantity;i++)
{
users.Add(new User("FirstName" + i.ToString(), "LastName" + i.ToString(), i));
}

gridUsers.DataSource = users;
gridUsers.DataBind();
}
}

class User
{
string _firstname;
string _lastname;
int _age;

public User(string fn, string ln, int age)
{
_firstname = fn;
_lastname = ln;
_age = age;
}

public string FirstName
{
get
{ return _firstname; }

set
{ _firstname = value; }
}

public string LastName
{
get
{ return _lastname; }

set
{ _lastname = value; }
}

public int Age
{
get
{ return _age; }

set
{ _age = value; }
}
}

Es todo. Qué más queda decir? que no deben abusar de esta funcionalidad, porque mal usada puede terminar convirtiéndose más en un problema que beneficio… y de preferencia pónganle el intervalo de refrescado lo más alto posible, recuerden que cada refrescado de sección de página es una ida y vuelta al servidor.

No hay comentarios.: