Problème avec Update Panel, Timer et Send Boutton
Bonjour,
je vous explique mon problème je développe un tchat en asp.net c# qui marche avec yaf (yet another forum), pour pouvoir le placé dans ma master page,j'ai fini le développement de mon contrôle que j'ai mis dans ma masterpage mais j'ai un problème avec l'envoie d'un nouveau message.
Mon tchat se met à jour toutes les 5 secondes en récupérant la liste des connectés et les 20 derniers messages mais dès que j'envoie un message le tchat ne se met plus à jour et le timer s'arrête (en debug je vois que l'update n'est plus appelé) et si je clique comme un acharné sur le bouton d'envoie de message je vois bien mes messages apparaître et le timer remarche normalement.
Quel est le problème?
Partie aspx:
Code:
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Tchat.ascx.cs" Inherits="UserControl_Tchat" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit.HTMLEditor"
TagPrefix="cc1" %>
<%@ Register Src="~/UserControl/TextEditeur.ascx" TagPrefix="uc" TagName="TextEditeur" %>
<%@ Register TagPrefix="Yaf" Namespace="YAF.Core" %>
<script type="text/javascript">
// Is is absolutely necessary that this JavaScript be on the page below the ScriptManager tag.
// Otherwise, the Sys object won't be available and an exception will occur.
var scrollTop;
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
function InitializeRequest(sender, args) {
scrollTop = document.getElementById('DivText').scrollTop;
}
function EndRequest(sender, args) {
resize();
document.getElementById('DivText').scrollTop = scrollTop;
}
function AddSmiley(text) {
document.getElementById('<%=this.TextBox1.ClientID %>').value += text;
}
function ShowSmiley() {
var divEmoticone = document.getElementById('emoticone');
divEmoticone.hidden = !divEmoticone.hidden;
}
function ClearText() {
var textbox = document.getElementById('<%=this.TextBox1.ClientID %>');
textbox.value = '';
textbox.focus();
}
</script>
<asp:UpdatePanel runat="server" ID="UPTchat" UpdateMode="Conditional">
<%-- <Triggers>
<asp:AsyncPostBackTrigger ControlID="BtnSend" />
<asp:AsyncPostBackTrigger ControlID="TimerTchat" EventName="Tick" />
</Triggers>--%>
<ContentTemplate>
<asp:Timer ID="TimerTchat" runat="server" Interval="5000" OnTick="TimerTchat_Tick" />
<div id="DivText" class="tchat">
<table style="background-color: White;">
<tr>
<td style="width: 100%; vertical-align: top">
<div class="tchatMessage">
<asp:Repeater ID="RepeaterTchat" runat="server" OnItemDataBound="RepeaterTchat_ItemDataBound">
<ItemTemplate>
<asp:Label ID="lblUser" runat="server"></asp:Label>
<asp:Label ID="lblMessage" runat="server"></asp:Label>
</ItemTemplate>
<SeparatorTemplate>
</SeparatorTemplate>
</asp:Repeater>
</div>
</td>
<td class="tchatConnecte">
<asp:ListBox ID="ListConnecte" runat="server" Width="150" Height="200" CssClass="test">
</asp:ListBox>
</td>
</tr>
<tr style="width: 100%">
<td style="width: 100%" colspan="2">
</td>
</tr>
<tr>
<td style="width: 100%;">
<asp:TextBox ID="TextBox1" CssClass="tchatEditeur" runat="server"></asp:TextBox>
</td>
<td>
<asp:Button ID="BtnSend" runat="server" Text="Envoyer" OnClick="BtnSend_Click" />
<asp:Button ID="BtnClear" runat="server" Text="Effacer" OnClientClick="ClearText();" />
</td>
</tr>
<tr>
<td style="width: 100%;" colspan="2">
<asp:ImageButton ID="ImageButton1" OnClientClick="ShowSmiley();" runat="server" ImageUrl="~/Images/BtnEmoticone.png" />
<div id="emoticone" hidden="hidden" style="z-index: 50; background-color: #FFFFFF;
background-repeat: repeat;">
<asp:Repeater ID="RepeaterEmoticone" runat="server" OnItemDataBound="RepeaterEmoticone_ItemDataBound">
<ItemTemplate>
<asp:ImageButton ID="btnEmoticone" runat="server" />
</ItemTemplate>
</asp:Repeater>
</div>
</td>
</tr>
</table>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<%--<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UPTchat">
<ProgressTemplate>
<asp:Image ID="ImageUpdate" ImageUrl="~/Images/sorcier.png" runat="server" />
</ProgressTemplate>
</asp:UpdateProgress>--%> |
partie c#:
Code:
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using crazyModel;
using YAF.Core;
using System.Web.Security;
public partial class UserControl_Tchat : System.Web.UI.UserControl
{
private Tchat tchat = new Tchat();
List<yaf_Smiley> Smileys;
YafContext context;
private int nbMessage = 20;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
context = YafContext.Current;
if (context == null)
context = new YafContext();
// on peut envoyé un message que si on est connecté
if (!Page.User.Identity.IsAuthenticated)
{
TextBox1.Enabled = false;
TextBox1.Text = "Vous devez être connecté pour pouvoir poster.";
ImageButton1.Enabled = false;
BtnClear.Enabled = false;
BtnSend.Enabled = false;
}
// on récupère la liste des smiley et on les affiches
Smileys = tchat.GetSmiley();
RepeaterEmoticone.DataSource = Smileys;
RepeaterEmoticone.DataBind();
ViewState["Smileys"] = Smileys;
// on met à jour le tchat avec les derniers messages
Update();
}
// on récupère les smiley stocké dans le viewstate
Smileys = ViewState["Smileys"] as List<yaf_Smiley>;
//if (Smileys != null)
//{
// foreach (var item in Smileys)
// {
// string url = "~/Images/emoticons/" + item.Icon;
// ImageButton imgBtn = new ImageButton();
// imgBtn.ImageUrl = url;
// imgBtn.AlternateText = item.Code;
// imgBtn.ToolTip = item.Emoticon;
// imgBtn.OnClientClick = "javascript:AddSmiley('" + item.Code + "')";
// PlaceHolder1.Controls.Add(imgBtn);
// }
//}
}
protected void RepeaterTchat_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// on rempli le repeater avec les données du tchat
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
((Label)e.Item.FindControl("lblUser")).Text = ((yaf_ShoutboxMessage)e.Item.DataItem).UserName + " : ";
((Label)e.Item.FindControl("lblMessage")).ToolTip = ((yaf_ShoutboxMessage)e.Item.DataItem).PostedSince;
((Label)e.Item.FindControl("lblMessage")).Text = ((yaf_ShoutboxMessage)e.Item.DataItem).Message + "<br/>";
}
}
// permet de récupérer les messages du tchat et de les afficher
private void LireMessage()
{
//int dernierMessageTchat = tchat.IdDernierMessage();
//List<yaf_ShoutboxMessage> listMessage = RepeaterTchat.DataSource as List<yaf_ShoutboxMessage>;
//int dernierMessage = -1;
//if (listMessage != null)
//{
// dernierMessage = listMessage.Max(sh => sh.ShoutBoxMessageID);
//}
//if (dernierMessage != dernierMessageTchat)
//{
List<yaf_ShoutboxMessage> listMessage = tchat.LireMessage(nbMessage);
RepeaterTchat.DataSource = AddSmileyInMessage(listMessage);
RepeaterTchat.DataBind();
//}
}
// permet de récupérer la liste des connectés et de les afficher
private void RecupererConnecte()
{
ListConnecte.DataSource = tchat.ListeConnecte();
ListConnecte.DataBind();
}
// a chaque tick on met à jour le tchat et la liste des connectés
protected void TimerTchat_Tick(object sender, EventArgs e)
{
Update();
}
// permet de remplacer les tags des smileys par leur image dans le tchat
private List<yaf_ShoutboxMessage> AddSmileyInMessage(List<yaf_ShoutboxMessage> listeMessage)
{
List<yaf_ShoutboxMessage> messages = new List<yaf_ShoutboxMessage>();
Smileys = ViewState["Smileys"] as List<yaf_Smiley>;
if (Smileys != null)
{
foreach (var message in listeMessage)
{
if (string.IsNullOrWhiteSpace(message.Message))
{
continue;
}
foreach (var smiley in Smileys)
{
message.Message = message.Message.Replace(smiley.Code, "<Img alt=\"" + smiley.Emoticon + "\" src=\"" + Request.ApplicationPath + "/Images/emoticons/" + smiley.Icon + "\" />");
}
messages.Add(message);
}
}
return messages;
}
// met à jour le tchat
private void Update()
{
LireMessage();
RecupererConnecte();
}
protected void BtnSend_Click(object sender, EventArgs e)
{
try
{
TimerTchat.Enabled = false;
string texte = TextBox1.Text;
// permet d'ajouter un nouveau message au tchat
if (!string.IsNullOrWhiteSpace(TextBox1.Text))
{
yaf_ShoutboxMessage message = new yaf_ShoutboxMessage();
context = YafContext.Current;
if (context != null)
{
message.UserName = context.PageUserName;
message.UserID = context.PageUserID;
message.Date = DateTime.Now;
message.BoardId = context.PageBoardID;
message.IP = HttpContext.Current.Request.UserHostAddress;
message.Message = TextBox1.Text;
if (tchat.EcrireMessage(message))
{
TextBox1.Text = "";
Update();
}
else
{
TextBox1.Text += " Envoi échoué";
}
}
}
}
catch (Exception ex)
{
TextBox1.Text = "Erreur: " + ex.Message;
}
finally
{
TimerTchat.Enabled = true;
}
}
protected void RepeaterEmoticone_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// on rempli le repeater avec la liste des smileys
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
yaf_Smiley smiley = e.Item.DataItem as yaf_Smiley;
ImageButton imgBtn = (e.Item.FindControl("btnEmoticone")) as ImageButton;
if (smiley != null && imgBtn != null)
{
string url = "~/Images/emoticons/" + smiley.Icon;
imgBtn.ImageUrl = url;
imgBtn.AlternateText = smiley.Code;
imgBtn.ToolTip = smiley.Emoticon;
imgBtn.OnClientClick = "javascript:AddSmiley('" + smiley.Code + "')";
}
}
}
} |