Contagem de novas mensagens dinamicamente
06/09/2011
0
Hernane Goncalves
Posts
06/09/2011
Rodrigo Odasaki
Utiliza um timer para fazer a requisição de tanto em tanto tempo.
As mensagens(registros) que o usuário abrir você invoca no evento init para salvar na coluna como lida, colocando como true. Se ela não foi lida por padrão nasce como false.
06/09/2011
Rodrigo Odasaki
07/09/2011
Hernane Goncalves
10/09/2011
Rodrigo Odasaki
O que você pode fazer é otimizar essa consulta utilizando Ajax para realizar uma chamada assíncrona no servidor somente da área a qual você deseja, no caso a contagem.
10/09/2011
Hernane Goncalves
11/09/2011
Rodrigo Odasaki
Tabelas:
Default.aspx
O ScrpitManager no topo é responsável por realizar as chamadas assíncronas com o servidor.
Dentro do container ContentTemplate você vai colocar os dados que deseja atualizar.
No Timer será responsável por realizar a chamada de tanto em tanto tempo, a propriedade Interval é responsável por isso e ela trabalha em milisegundos. No caso no exemplo acima está de 5 em 5 segundos.
A Trigger informa que o PostBack para o controle Timer é assíncrono.
Na label countMsgLabel recebe a contagem total de todas as mensagens para este usuário.
Na página Default.aspx.cs
Para não ter erro fiz o exemplo com ADO.NET e LINQ TO SQL.
O que você precisa fazer apenas é escolher o método que carrega no page load e no método TimercountMsg_Tick retirando o comentário.
No where eu coloquei o id para simplificar, mas você pode tratar isso de acordo com o usuário que está logado.
Se for usar ADO, eu recomendo você utilizar procedure.
Se tiver dúvida em qualquer linha me avisa.
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections;
namespace Devmedia{ public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { LoadCountMessageWithADO(); //LoadCountMessageWithLINQ(); //LoadCountMessageWithLINQLambda(); //LoadCountMessageWithLINQProcedure(); DateTimeNowForaLabel.Text = DateTime.Now.ToString(); DateTimeNowDentroLabel.Text = DateTime.Now.ToString(); }
// com ADO.NET
public void LoadCountMessageWithADO() { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Devmedia"].ConnectionString); string SQL = "Select COUNT(UserId) From UserMessage Where UserId = 1"; SqlCommand cmd = new SqlCommand(SQL, con); cmd.CommandType = CommandType.Text; con.Open(); SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (dr.Read()) { countMsgLabel.Text = dr[0].ToString(); } }
// com LINQ public void LoadCountMessageWithLINQ() { DevmediaDataContext db = new DevmediaDataContext(); var dados = from c in db.UserMessages where c.UserId == 1 select c; int count = dados.Count(); countMsgLabel.Text = count.ToString(); }
// com LINQ utilizando Lambda Expression public void LoadCountMessageWithLINQ() { DevmediaDataContext db = new DevmediaDataContext(); var dados = db.UserMessages.Where(c => c.UserId == 1).Select(c => c.UserId); int count = dados.Count(); countMsgLabel.Text = count.ToString(); }
// com LINQ utilizando Procedure public void LoadCountMessageWithLINQProcedure() { DevmediaDataContext db = new DevmediaDataContext(); var qualquercoisa = db.SPCountMessageUser();
foreach (var item in qualquercoisa) { countMsgLabel.Text = item.Column1.ToString(); } }
protected void TimercountMsg_Tick(object sender, EventArgs e) { LoadCountMessageWithADO(); //LoadCountMessageWithLINQ(); //LoadCountMessageWithLINQLambda(); //LoadCountMessageWithLINQProcedure(); } }}
11/09/2011
Rodrigo Odasaki
Sobre as outras Label eu coloquei para você ver a diferença com um DateTime.Now dentro do UpdatePanel e outro fora.
Insert Into UserMessage (UserId, Resume, Description, Date)VALUES(1, 'Resume of message', 'description of message', GETDATE())
Após o Insert, veja que o conteúdo foi atualizado, porém somente dentro do UpdatePanel.
Clique aqui para fazer login e interagir na Comunidade :)