Mostrando las entradas con la etiqueta AJAX CONTROL TOOLKIT. Mostrar todas las entradas
Mostrando las entradas con la etiqueta AJAX CONTROL TOOLKIT. Mostrar todas las entradas

lunes, 8 de agosto de 2011

ASP.NET - FileUpload desde ModalPopupExtender y UpdatePanel

fileupload_from_modalpopup Muchos piensan que esto no es posible: subir archivos al servidor desde un ModalPopup , el cual está dentro de un UpdatePanel, pues sí es posible.
Resumiendo, el código debe tener esta forma:
<UpdatePanel ChildrenAsTriggers="true">
<ContentTemplate>
<Panel>
FileUpload…+ El botón que subirá tu archivo y guardará tu información, mi botón se llama btnSave
Otros controles…
<Panel>
<ModalPopupExtender />
</ContentTemplate>
<Triggers>
    <asp:PostBackTrigger ControlID="btnSave" />
</Triggers>

</UpdatePanel>
Y ese es el resumen. Como pueden observar, la novedad del updatepanel es que tiene la propiedad ChildrenAsTriggers=”true” y la otra novedad es que antes de que cierre el updatepanel, se ha añadido el tag triggers, como ven en la imagen muy claramente.
Vamos a ver el ejemplo mediante código, copien esto en una nueva página aspx:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Subir archivos desde el modalpopup dentro un Updatepanel</title>
<style type="text/css">
*
{
font-family: Tahoma;
}
.modalPopup 
{
background-color:orange;
border-width:5px;
border-style:solid;
padding:3px;
}  

.modalBackground 
{
filter:alpha(opacity=50);
opacity:0.7;
}      
</style>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" ChildrenAsTriggers="true" runat="server">
<ContentTemplate>
<asp:HyperLink ID="hplOpenModal" NavigateUrl="javascript:;" 
runat="server">Mostrar ModalPopup</asp:HyperLink>
<asp:Panel ID="pnlFileAdd" runat="server" Style="display: none" 
CssClass="modalPopup" Height="100px" Width="300px">
<asp:FileUpload ID="FileUpload1" runat="server" />
<p>
<asp:Button ID="btnSave" runat="server" Text="Subir archivo" />
<asp:Button ID="btnCancel" runat="server" Text="Cancelar" />
</p>
</asp:Panel>
<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" 
TargetControlID="hplOpenModal" PopupControlID="pnlFileAdd" 
BackgroundCssClass="modalBackground" CancelControlID="btnCancel" Y="100" />

</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnSave" />
</Triggers>
</asp:UpdatePanel>
</form>
</body>
</html>


Esto va en el código VB.NET:

Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click

If FileUpload1.HasFile Then
FileUpload1.SaveAs(Server.MapPath("~/uploads/") & FileUpload1.FileName)
End If

End Sub


Se supone que en la raiz de la applicación hay una carpeta llamada Uploads, donde se guardará el archivo. Eso sería todo.
Espero que les sea de utilidad ;)

miércoles, 27 de abril de 2011

ASP.NET – Detectar via javascript cuando el control SliderExtender cambia

Vamos a hacer un post simpático, que puede ser muy útil.
El caso consiste en lo siguiente: usaremos un control SliderExtender del Ajax Control Toolkit para comunicar el progreso de una tarea, pero lo interesante es que debe haber un código javascript que detecte este movimiento o cambio del porcentaje que vamos a comunicar… entonces, al detectar que se ha llegado al 100% de la tarea, se debe mostrar un control checkbox… el cual podrá ser marcado, pero si le bajamos el progreso a menos del 100% nuevamente el control checkbox debe ocultarse. Véalo en imágenes:
progress0
progress1
Empecemos entonces.
1.- El primer paso es obviamente añadirle las referencias al Ajax Control Toolkit y a ASP.NET ajax al proyecto.
2.- Luego, pongan este código en la página aspx, dentro del elemento Form:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<table style="width: 99%">
<tr>
<th>
&nbsp;<asp:Label ID="lblTask" Font-Bold="true" runat="server" Text=""></asp:Label>
</th>
</tr>
<tr>
<td style="padding: 20px;text-align: center">
Comunique el Progreso: 
<p>
<asp:TextBox ID="txtProgress" Text="0" runat="server"></asp:TextBox>
<ajaxToolkit:SliderExtender ID="SliderExtender1" runat="server" TargetControlID="txtProgress"
Minimum="0" Maximum="100" Length="340" BoundControlID="lblProgress" Steps="100" />
<asp:Label ID="lblProgress" runat="server"></asp:Label>%          

</p>
<p id="pMove" style="display: none">
<asp:CheckBox ID="chkToOldTasks" Text="Mostrar en la lista de temas anteriores(abajo)." runat="server" />
</p>

<asp:ImageButton ID="imgUpdateProgress" ToolTip="Actualizar el progreso de la tarea"
ImageUrl="~/images/save.png" runat="server" />
</td>
</tr>
</table>

<script type="text/javascript">
function pageLoad(sender, e) 
{
var slider = $find('SliderExtender1');
slider.add_valueChanged(onValueChanged);
}

function onValueChanged(sender, e) 
{
var txtProgress = document.getElementById('txtProgress');
var chkToOldTasks = document.getElementById('chkToOldTasks');
var pMove = document.getElementById('pMove');
if (txtProgress.value == '100') 
{
pMove.style.display = 'block';
}
else 
{
pMove.style.display = 'none';
chkToOldTasks.removeAttribute("checked");
}
}
</script>

Y eso es todo, así de simple.

Nota: Esta funcionalidad, originalmente, incluía una master page, una página y un control de usuario… pero por razones de simplificar el post, lo he resumido tal como lo han leído.

Si al testear la funcionalidad, algo no te funciona bien en el código, simplemente haz un comentario y lo resolvemos juntos, ok?

Espero que les sea de utilidad ;)

viernes, 22 de enero de 2010

ASP.NET – Evitar validar controles ocultos

validator Vamos a analizar una situación ( a ver si les ha pasado ya):

+Tenemos un formulario para el ingreso de información

+Todos los campos tienen controles de validación, osea… si no se ingresa alguna información… no se podrá enviar el formulario (vamos a suponer que javascript está habilitado).

+Pero a veces ocurre que, damos la opción de no ingresar algún dato… osea: Si no quieres ingresar la información esconde el control… poniéndole el check al checkbox escondemos el dropdownlist (vean la imagen),

Y obviamente no vamos a esconder el control desde el lado del servidor, osea haciendo un postback… no es necesario (eso es malo para la salud ;))… con un minímo de javascript ya está.

El problema es que si usamos javascript para ocultar el/los controles, las validaciones de esos controles que pretendemos esconder seguirán exigiendo el dato …

hagan la prueba, escondan algún control que está amarrado a un control de validación y verán que la validación sigue siendo solicitada.

Entonces, lo que tenemos que hacer es desactivar los controles de validación (también desde javascript) y asunto solucionado.

Vamos a hacer un ejemplito para demostrar esto:

Este es el código aspx + html + javascript:

<head runat="server">
<
title>xxx</title>
<
style type="text/css">
*
{
font-family: Trebuchet MS;
margin: 5px;
}
table
{
width: 40%;
border: dotted 1px green;
background-color: burlywood;
}
</style>

<
script type="text/javascript">
function
HideControls()
{
var chkLater = document.getElementById("<%=chkLater.ClientID %>");
var divUserType = document.getElementById("divUserType");
var rfvUserType = document.getElementById('<%= rfvUserType.ClientID %>');

if(chkLater.checked==true)
{
divUserType.style.display = "none";
ValidatorEnable(rfvUserType, false);
}
else
{
divUserType.style.display = "block";
ValidatorEnable(rfvUserType, true);
rfvUserType.isvalid = true;
ValidatorUpdateDisplay(rfvUserType);
}

}
</script>
</
head>
<
body>
<
form id="form1" runat="server">
<
table>
<
tbody>
<
tr>
<
th colspan="2" style="background-color: brown">
Creación de Nuevo Usuario</th>
</
tr>
<
tr>
<
td style="width: 15%">
Usuario:
</td>
<
td>
<
asp:TextBox ID="txtUser" Width="80%" runat="server"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvUser" runat="server"
ErrorMessage="*" ControlToValidate="txtUser" Display="Dynamic"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
Email:
</td>
<
td>
<
asp:TextBox ID="txtEmail" Width="80%" runat="server"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvEmail" runat="server"
ErrorMessage="*" ControlToValidate="txtEmail" Display="Dynamic"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
Contraseña:
</td>
<
td>
<
asp:TextBox ID="txtPassword" Width="80%" runat="server"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvPassword" runat="server"
ErrorMessage="*" ControlToValidate="txtPassword" Display="Dynamic"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
&nbsp;
</td>
<
td>
&nbsp;
</td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap; vertical-align: top">
Tipo:
</td>
<
td>
<
div id="divUserType">
<
asp:DropDownList ID="ddlUserType" Width="80%" runat="server">
<
asp:ListItem Value="0" Text="(Seleccione un item)"></asp:ListItem>
<
asp:ListItem Value="1" Text="Usuario Premium"></asp:ListItem>
<
asp:ListItem Value="2" Text="Usuario Limitado"></asp:ListItem>
</
asp:DropDownList>
<
asp:RequiredFieldValidator ID="rfvUserType" runat="server"
ErrorMessage="*" ControlToValidate="ddlUserType" Display="Dynamic"
InitialValue="0"></asp:RequiredFieldValidator>
</
div>
<
asp:CheckBox ID="chkLater" Text="Después decidiré." runat="server" />
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
&nbsp;
</td>
<
td>
<
div style="width: 85%; text-align: right">
<
asp:Button ID="btnSave" runat="server" Text="Guardar datos" />
</
div>
</
td>
</
tr>
</
tbody>
</
table>
</
form>
</
body>

Eso es todo… o casi todo… lo único que me falta es amarrar el evento onclick al checkbox:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If IsPostBack Then Return

chkLater.Attributes.Add("onclick", "HideControls()")

End Sub

Para resumir:

La parte que hace todo el trabajo es el código javascript.

Espero que les sea de utilidad ;)

miércoles, 6 de enero de 2010

ASP.NET – obtener Stock Quotes automaticamente cada x segundos

stockquotes Podemos darle un gran valor agregado a nuestro web site si le añadimos la funcionalidad de estar mostrando la información de sus stock quotes actualizados…(claro, en el caso que tuviera).

Vamos a mostrar una manera sencilla y simple de cómo podemos mostrar la información de un determnado símbolo de stock quotes en una página ASP.NET… obviamente uds lo pueden mejorar, la idea aquí (como siempre) es que se entienda cómo hacerlo.

0.- Vamos a usar el ajaxcontrol toolkit y ASP.NET ajax 2.0… así que asegúrense de haberlos referenciado en su proyecto.

1.- Añadimos un control de usuario ascx a nuestro proyecto, lo llamamos wucStockQuotes.ascx

1.1.- le añadimos un UpdatePanel, un timer y el código HTML necesario que me permita mostrar el stock quotes en una pequeña tabla, así debiera quedar:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<
ContentTemplate>
<
asp:Timer ID="Timer1" Interval="10000" runat="server">
</
asp:Timer>
<
table style='width: 85%; text-align: left; width: 200px'>
<
tr>
<
td>
<
span style='font-weight: bold'>
<
asp:Literal ID="ltSymbol" runat="server"></asp:Literal></span>
</
td>
<
td>
<
span style='font-weight: bold'>OTC BB</span>
</
td>
</
tr>
<
tr>
<
td>
Last
</td>
<
td>
<
asp:Literal ID="ltLast" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Change
</td>
<
td>
<
asp:Literal ID="ltChange" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Volume
</td>
<
td>
<
asp:Literal ID="ltVolume" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Day's Range
</td>
<
td>
<
asp:Literal ID="ltDaysRange" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Open
</td>
<
td>
<
asp:Literal ID="ltOpen" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Prev. Close
</td>
<
td>
<
asp:Literal ID="ltPrevClose" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Market Cap
</td>
<
td>
<
asp:Literal ID="ltMarketCap" runat="server"></asp:Literal>
</
td>
</
tr>
</
table>
</
ContentTemplate>
</
asp:UpdatePanel>









El Timer tiene un Interval de 10000 milisegundos, entonces se supone que la información deberá refresacarse cada 10 segundos.

En el code beside:

+ creamos una propiedad pública llamada Symbol, que me permitirá obtener el símbolo del stock quotes desde la página aspx.

+ Creamos un procedimiento llamado StockQuotes() , el cual permitirá mostrar la información recuperada desde YAHOO, vean el código completo:

Public Partial Class wucStockQuotes
Inherits System.Web.UI.UserControl

Private _Symbol As String = "MSFT"
Public Property Symbol() As String
Get
Return
_Symbol
End Get
Set
(ByVal value As String)
_Symbol = value
End Set
End Property

Protected Sub
Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
StockQuotes()
End Sub

Protected Sub
Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
StockQuotes()
End Sub

Private Sub
StockQuotes()
        Dim c As Char = System.Web.UI.Html32TextWriter.DoubleQuoteChar

Dim sq As String = Get_DataFromYahoo(_Symbol)
Dim arrValues() As String = sq.Split(",")

ltSymbol.Text = _Symbol
ltLast.Text = arrValues(1)
ltChange.Text = String.Format("{0}({1})", arrValues(4), arrValues(11).Replace(c, "").Replace("+", ""))

ltVolume.Text = String.Format("{0:#,###}", Convert.ToDouble(arrValues(8)))
ltDaysRange.Text = String.Format("{0}-{1}", arrValues(7), arrValues(6))
ltOpen.Text = arrValues(5)
ltPrevClose.Text = arrValues(10)
ltMarketCap.Text = arrValues(9)

End Sub

Public Shared Function
Get_DataFromYahoo(ByVal symbol As String) As String
Dim
url As String = "http://download.finance.yahoo.com/d/quotes.csv?s={0}&d=t&f=sl1d1t1c1ohgvj1pp2wern"

Return GetHTMLFromURL(String.Format(url, symbol))

End Function

Public Shared Function
GetHTMLFromURL(ByVal URL As String) As String
Dim
ASCII As New System.Text.ASCIIEncoding
Dim netWeb As New System.Net.WebClient
Dim lsWeb As String
Dim
laWeb As Byte()

Try
laWeb = netWeb.DownloadData(URL)
lsWeb = ASCII.GetString(laWeb)
Catch ex As Exception
Throw New Exception(ex.Message.ToString + ex.ToString)
End Try

Return
lsWeb

End Function

End Class

Lo que se hace aquí (a grandes rasgos es):

Yahoo devuelve los datos en un string separado por comas,,, entonces lo que hacemos en splitearlo y luego mostrar los datos que nos interesan, dándole un poco de formato.

2.- Añadimos una página aspx a nuestro proyecto, lo llamamos StockQuotes.aspx y le añadimos un scriptManager, luego arrastramos el control de usuario wucStockQuotes.ascx creado previamente sobre la página aspx, el código final debe verse más o menos así:

<html xmlns="http://www.w3.org/1999/xhtml" >
<
head runat="server">
<
title>Obtener Stock Quotes</title>
<
style type="text/css">
* { font-family: Trebuchet MS; }
</style>
</
head>
<
body>
<
form id="form1" runat="server">
<
asp:ScriptManager ID="ScriptManager1" runat="server">
</
asp:ScriptManager>
<
h3>Obtener stock Quotes cada x segundos</h3>

<
uc1:wucStockQuotes ID="wucStockQuotes1" Symbol="IBM" runat="server" />

</
form>
</
body>
</
html>









Dense cuenta que en el control de usuario que acabo de arrastrar hacia la página aspx he puesto Symbol="IBM" lo cual significa que ese será el Stock Quotes a consultar.

Cualquier duda, comentan? ;)

miércoles, 25 de noviembre de 2009

ASP.NET – Resetear o limpiar modalpopup extender

modalpopup_clear Se habrán dado cuenta que cuando hacemos uso del modalpopup del ajaxcontrol toolkit, osea ingresamos valores en los controles contenidos en él, y luego de guardar la información y cerramos el modalpopup… al volver a abrir el modalpopup, éste mantiene los valores que escribimos en cada control, inclusive mantiene seleccionado el dropdownlist y los listboxes, tal como los habíamos seleccionado.

Esta conducta, muchas veces es ventajosa, porque nos ahorra el volver a escribir o seleccionar algunas opciones de los controles. Pero, qué pasa si queremos que cada vez que abrimos el modalpopup extender esté limpio otra vez?

Pues fácil, vamos a mostrar un pequeño ejemplo didáctico.

1.- Creamos un proyecto web ASP.NET y añadimos la referencia al ajaxcontrol toolkit.

2.- Creamos una página aspx llamada clear_modalpopup.aspx que contenga el siguiente código:

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html>
<
head>
<
title>xxx</title>
<
style type="text/css">
*
{
font-family: Trebuchet MS, Verdana;
}
.modalPopup
{
border: solid 5px red;
background-color: orange;
filter: alpha(opacity=70);
opacity: 0.7;
}
</style>
</
head>
<
body>
<
form id="form1" runat="server">
<
div>
<
asp:ScriptManager ID="ScriptManager1" runat="server" />
<
asp:LinkButton ID="LinkButton1" runat="server" Text="Añadir información" />
<
asp:Panel ID="Panel1" runat="server" Style="display: block" CssClass="modalPopup"
Height="250px" Width="400px">
<
table style="width: 100%">
<
tr>
<
td colspan="2">
<
strong>Datos del usuario</strong>
</
td>
</
tr>
<
tr>
<
td style="width: 10%">
Nombre:
</td>
<
td>
<
asp:TextBox ID="txtName" Width="90%" runat="server"></asp:TextBox>
</
td>
</
tr>
<
tr>
<
td>
Apellido:
</td>
<
td>
<
asp:TextBox ID="txtLastName" Width="90%" runat="server"></asp:TextBox>
</
td>
</
tr>
<
tr>
<
td>
Email:
</td>
<
td>
<
asp:TextBox ID="txtEmail" runat="server" Width="90%"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvEmail" runat="server" ControlToValidate="txtEmail"
Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td>
Nacionalidad:
</td>
<
td>
<
asp:DropDownList ID="ddlCountry" runat="server" Width="90%">
<
asp:ListItem Value="0" Text="(Seleccione una opción)"></asp:ListItem>
<
asp:ListItem Value="1" Text="Española"></asp:ListItem>
<
asp:ListItem Value="2" Text="Mexicana"></asp:ListItem>
<
asp:ListItem Value="3" Text="Chilena"></asp:ListItem>
<
asp:ListItem Value="4" Text="Peruana"></asp:ListItem>
</
asp:DropDownList>
</
td>
</
tr>
<
tr>
<
td colspan="2" style="text-align: right; height: 100px; vertical-align: bottom">
<
asp:Button ID="btnSave" runat="server" Text="Guardar" />
</
td>
</
tr>
</
table>
</
asp:Panel>
<
ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="LinkButton1"
PopupControlID="Panel1" OkControlID="btnSave" />
</
div>
</
form>

<
script type="text/javascript">
function
pageLoad() {
var ModalPopupExtender1 = $find("ModalPopupExtender1");
ModalPopupExtender1.add_hidden(Controls_Clear);
}
function Controls_Clear() {
var txtName = $get("txtName");
var txtLastName = $get("txtLastName");
var txtEmail = $get("txtEmail");
var ddl = $get("ddlCountry");
var rfvEmail = $get("rfvEmail");

txtName.value = "";
txtLastName.value = "";
txtEmail.value = "";
rfvEmail.style.display = "none";
ddl.selectedIndex = 0;
}
</script>

</
body>
</
html>

Y eso es todo, la parte interesante está en el pequeño código javascript, el cual es quien se encarga de resetear los valores tanto de los textboxes, los controles de validación y el dropdownlist.

Uds pueden extender este código para que funcione para la mayoría de controles ASP.NET.

;)

miércoles, 14 de octubre de 2009

ASP.NET – Cambiar el idioma del calendarextender ajax control toolkit

calendar Como ya se habrán dado cuenta, el calendarextender viene por defecto mostrando sus textos en el idioma inglés, será porque se hizo por gente de habla inglesa? ;)

No es problema, pero configurarlo para que muestre sus textos en el idioma de nuestra aplicación web es muy fácil, veamos:

1.- Modificamos el web.config de acuerdo al idioma que deseamos, por ejemplo Yo pondré es-PE, que es español-Perú

<globalization culture="es-PE" uiCulture="es-PE" />

2.- Vamos al script manager y le agregamos EnableScriptGlobalization=”true”

<asp:ScriptManager ID="ScriptManager1" EnableScriptGlobalization="true" runat="server">
</
asp:ScriptManager

Obviamente los pasos aplicados arriba aplican para una aplicación que tiene un idioma específico no? osea, no cambia dinámicamente el idioma.

Si se tuviera que cambiar dinámicamente el idioma de la aplicación, entonces tendríamos que quitar del web.config los tags que ingresamos previamente y añadirlo desde código en el page_load de alguna página:

1.-

Imports System.Threading

Partial Public Class _Default
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim DinamicLanguage As String = "es-PE"
Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo(DinamicLanguage)

End Sub
   …   …

2.- Agregarle al script manager lo sgte:

<asp:ScriptManager ID="ScriptManager1" EnableScriptGlobalization="true" runat="server"> </asp:ScriptManager

Y eso es todo, ejecuten su aplicación y verán los textos acorde al idioma configurado. ;)

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.