5-15、16、17 实例-简易聊天室

panel在页面中呈现的是div标签,label在 页面中呈现span标签;

在panel中插入span:

5-15、16、17 实例-简易聊天室

5-15、16、17 实例-简易聊天室

运行效果:

5-15、16、17 实例-简易聊天室

不足:两个label的内容是并排的;


literal控件,按照下列方法添加,在页面中以标签<br>的形式体现:

5-15、16、17 实例-简易聊天室


因此,改进后的代码为:

5-15、16、17 实例-简易聊天室

运行效果图:

5-15、16、17 实例-简易聊天室


新的问题:

上面的添加标签的方法,后添加的标签放在下面,而我们要做的聊天室,后出现的对话要放在上面;

解决思路:

其中,Panel1.Controls.Add(index, control)这个方法,index置零,表示头插,control是要插入的控件;

5-15、16、17 实例-简易聊天室

效果图:

5-15、16、17 实例-简易聊天室

对用户操作习惯的考虑:

当一个页面中有很多的按钮,如何实现用户按下回车,点击的就是期望的按钮,以及当有很多文本框时,光标默认在哪个文本框当中,方法如下:

首先,打开form控件的属性:

DefaultButton:表示默认选中的按钮;

DefaultFocus:表示默认选中的文本框;

5-15、16、17 实例-简易聊天室


登陆逻辑分析:

1、进入登陆页面,输入用户名,如果输入正确,则跳转到聊天页面,否则继续输入用户名;

2、登录时,用户可能直接跳过登陆页面而转向聊天页面,此时,聊天页面检测该登录名是否存在,如果不存在,则踢回登陆页面;

3、

5-15、16、17 实例-简易聊天室


聊天室开发具体过程及代码:

首先,建立一个工程,在工程中建立两个页面_login和_room;

在_login页面中完成以下内容:

5-15、16、17 实例-简易聊天室

相关代码:

5-15、16、17 实例-简易聊天室

注意在Button1控件中,加入OnClientClick事件,用于接收checkUID的返回值,checkUID函数使用JavaScript写的;


checkUID函数的定义:

5-15、16、17 实例-简易聊天室

要注意,该函数要在源代码中完成(客户端),不要放在控件中完成,因为源代码是在客户端执行,而控件代码是由服务器执行。因此,文本框检测功能是在客户端完成的;


当文本框中含有登录名时,点击登陆按钮,要完成以下功能:

将用户信息保存在Session["uid"]当中,再将页面跳转到_room主页;

5-15、16、17 实例-简易聊天室

要通过Server.Transfer这种方式进行页面的跳转,以便对用户隐藏访问路径;


在_room页面中完成以下内容:

在_room页面加载时,首先做如下的判断:

5-15、16、17 实例-简易聊天室


room页面:5-15、16、17 实例-简易聊天室

上面为聊天内容,下面为聊天面板;

将整个聊天内容作为panel控件存放在application对象中,可实现多用户的访问;

当聊天面板有新内容时,将新内容添加到panel控件中,再将panel控件存放在application对象中;

注意panel的scrollbars属性,当设置为vertical时,为纵向滚动条;

5-15、16、17 实例-简易聊天室


在_login中,meta标签要放在head标签内,title标签上方:

5-15、16、17 实例-简易聊天室

每隔三秒进行一次本页刷新;



在_login页面中添加如下后台代码:

5-15、16、17 实例-简易聊天室

这样,通过页面刷新,每个三秒钟,时间被刷新一次; 

5-15、16、17 实例-简易聊天室


在_room页面中进行如下页面设置:

5-15、16、17 实例-简易聊天室


在退出聊天按钮中做如下配置:

5-15、16、17 实例-简易聊天室


对上面的panel进行样式设定:

5-15、16、17 实例-简易聊天室


下面panel样式的设定:

5-15、16、17 实例-简易聊天室


上面panel设定纵向滚动条以及高度固定:

5-15、16、17 实例-简易聊天室


运行效果图:

login页面:

5-15、16、17 实例-简易聊天室

点登陆按钮后运行效果图:

5-15、16、17 实例-简易聊天室


改进:

对于Web控件而言,通过控件属性来修改控件的样式,操作较为麻烦,可以通过使用CSS属性修改样式:

我们将上下两个panel都设置为pnl1,然后通过设置pnl1的样式来设置两个panel,方法如下:

5-15、16、17 实例-简易聊天室

5-15、16、17 实例-简易聊天室


接下来定义pnl1的样式(在_room主页中定义pnl1的样式),如下:

在head中,title下方定义pnl1的样式:

5-15、16、17 实例-简易聊天室

改进后的样式:

5-15、16、17 实例-简易聊天室


接下来考虑,当我们的_room页面第一次载入的时候,即PageLoad事件发生的时候,要把application的内容直接放到panel1当中:

5-15、16、17 实例-简易聊天室

这样,通过这段代码,每次载入_room页面,都会执行最后一条指令,将panel添加到panel1当中;


接下来,在_room页面的发送按钮中,完成以下几个任务:

将用户名、时间、交流内容添加到panel当中,也就是application["chat"]这个panel当中去。首先我们用三个label控件来接收这些信息,代码如下:

5-15、16、17 实例-简易聊天室


至此,将该设置的内容进行设置:

首先,将_room中的form1的属性进行设置:

5-15、16、17 实例-简易聊天室


给页面添加定时页面刷新功能:

在_room页面中做如下处理:

5-15、16、17 实例-简易聊天室

由此,页面五秒钟进行一次刷新;


meta刷新的缺点,属于全局刷新,服务器返回一个全新的页面:

5-15、16、17 实例-简易聊天室

对于我们聊天室而言,需要刷新的只有上面的panel,因此,可以将panel改成iframe,然后将application["chat"]放到iframe子页当中去,这样实现了局部的刷新;

5-15、16、17 实例-简易聊天室

iframe下面存在一个_roomContent.aspx子页,因此刷新对母页没有影响;

首先,将上面的panel删除掉,并添加iframe,在_room主页中,实现如下:

5-15、16、17 实例-简易聊天室

将与panel1相关的内容屏蔽掉:

5-15、16、17 实例-简易聊天室

 

然后在网站中添加一个新的页面,_roomContent:

在这个页面中,每次PageLoad时都要读取并且显示Application["chat"]中的内容,实现如下:

我们将Application["chat"]放在主层当中,先给主层命名:

5-15、16、17 实例-简易聊天室

刷新页面:

5-15、16、17 实例-简易聊天室

在_roomContent页面中添加如下代码:

5-15、16、17 实例-简易聊天室