21.6 系统主界面模块
本聊天室系统的主界面分为如下3个部分。
(1)用户列表界面:显示当前在聊天室内的用户。
(2)信息显示界面:显示系统内用户的聊天信息。
(3)发布表单界面:用于发布用户的聊天信息。
本节将详细讲解上述3个部分的具体实现过程。
在上述3个部分中,信息显示界面是核心,在本节的内容中,将详细讲解显示聊天信息界面的实现过程。
21.6.1 在线聊天界面
在线聊天界面文件LiaoTian.aspx的功能是为在线用户提供聊天表单,并实现用户间的聊天处理。其具体实现过程如下。
(1)插入1个ListBox控件,用于显示此聊天室内的在线用户。
(2)插入1个TextBox控件,用于显示在线聊天信息。
(3)插入1个TextBox控件,供用户输入发布的聊天信息。
(4)插入1个Button控件,用于激活聊天内容的发布处理事件。
(5)插入1个Timer控件,用于定时刷新聊天页面的信息。
21.6.2 在线聊天处理页面
在线聊天处理页面文件LiaoTian.aspx.cs的功能是获取并显示系统内此聊天室的在线用户,并对用户发布的聊天信息进行处理。其具体实现过程如下。
(1)引入命名空间和声明ChatRoom类。
(2)通过Page_Load获取聊天室的编号,并进行初始化处理。
(3)通过函数ChatUserInit( )初始化聊天室信息。
(4)定义函数ShowUserData( ),显示在线用户信息。
(5)定义函数ShowMessageData( ),显示用户发布的聊天室信息。
(6)定义函数btUser_Tick(object sender,EventArgs e),实现聊天室的定式刷新处理。
(7)定义函数btnCommit_Click(object sender,EventArgs e),将新发布的信息添加到系统库中。
上述操作实现的具体运行流程如图21-6所示。
图21-6 在线聊天处理运行流程图
下面介绍上述功能的具体实现过程。
1.Page_Load初始化
事件Page_Load(object sender, EventArgs e)实现页面的初始化处理,其具体实现过程如下。
(1)通过Session["UserID"]值判断用户是否登录。
(2)获取当前聊天室的编号ID,并保存在ChatID中。
(3)分别调用函数ChatUserInit( )和函数ShowUserData( ),显示用户的信息。
上述功能对应的实现代码如下。
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//引入新的命名空间
using ASPNETAJAXWeb.AjaxChat;
using System.Data.SqlClient;
using System.Text;
using System.Collections.Generic;
public partial class ChatRoom : System.Web.UI.Page
{
int chatID = −1;
protected void Page_Load(object sender, EventArgs e)
{ //如果用户未登录,则重定向到登录页面
if(Session["UserID"] == null)
{
Response.Redirect("~/Login.aspx");
return;
}
//获取聊天室的ID值
if(Request.Params["ChatID"] != null)
{
chatID = Int32.Parse(Request.Params["ChatID"].ToString());
}
if(!Page.IsPostBack)
{ //初始化聊天室信息
ChatUserInit();
ShowUserData();
}
}
2.定义函数ChatUserInit()
函数ChatUserInit( )的功能是初始化此聊天室的信息,并使用ViewState保存用户进入聊天室的时间。其对应的实现代码如下。
private void ChatUserInit()
{ //保存进入聊天室的时间
ViewState["StartDate"] = DateTime.Now.ToString();
//设置用户进入的聊天室
for(int i = 0; i < ASP.global_asax.Users.Count; i++)
{
if(ASP.global_asax.Users[i].UserID.ToString() == Session["UserID"].ToString())
{
ASP.global_asax.Users[i].ChatID = chatID;
break;
}
}
}
3.定义函数ShowUserData()
函数ShowUserData( )的功能是获取此聊天室内当前的在线用户信息。其对应的实现代码如下。
private void ShowUserData()
{ //获取聊天室的用户
List<UserInfo> users = new List<UserInfo>();
foreach(UserInfo ui in ASP.global_asax.Users)
{
if(ui.ChatID == chatID)
{
users.Add(ui);
}
}
//显示聊天室的用户
lbUser.DataSource = users;
lbUser.DataValueField = "UserID";
lbUser.DataTextField = "Username";
lbUser.DataBind();
}
4.定义函数ShowMessageData()
函数ShowMessageData()的功能是定义Message()数组,通过数据库访问层方法GetNeirong(chatID)获取聊天室内的聊天信息,并将聊天信息详细地显示出来。其对应的实现代码如下。
private void ShowMessageData()
{ //获取所有消息
Message message = new Message();
DataSet ds = message.GetNeirong(chatID);
if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return;
//过滤进入该聊天室之前的消息,保留进入该聊天室之后的消息
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = string.Format("CreateDate >= '{0}'",DateTime.Parse(ViewState ["StartDate"].ToString()));
//构建聊天的消息
StringBuilder sbMessage = new StringBuilder();
foreach(DataRowView row in dv)
{ //设置一条消息
string singleMessage=row["Username"].ToString()+"在[" + row["CreateDate"]. ToString() + "]发表:\n";
singleMessage += " " + row["Message"].ToString() + "\n";
sbMessage.Append(singleMessage);
}
//显示聊天消息
tbChatMessage.Text = sbMessage.ToString();
}
5.刷新和发布处理
刷新和发布处理即实现页面的定时刷新处理和新内容的发布处理,上述功能的实现函数如下。
- 函数tUser_Tick(object sender,EventArgs e):实现聊天页面的定时刷新。
- 函数tUser_Tick(object sender,EventArgs e):调用数据库访问层的方法AddNeirong(string message, int userID,int chatID),将新发布的数据添加到系统库中。
上述功能对应的实现代码如下。
protected void tUser_Tick(object sender,EventArgs e)
{ //定时显示聊天室的信息
ShowMessageData();
ShowUserData();
}
protected void btnCommit_Click(object sender,EventArgs e)
{ //发送新消息并显示消息
Message message = new Message();
if (message.AddNeirong(tbMessage.Text, Int32.Parse(Session["UserID"].ToString()), chatID) > 0)
{ //显示消息
ShowMessageData();
}
}