string flag=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); //取当前行的索引
Response.Redirect(“maipiao.aspx?flag=”+flag); //跳转到买票页面,并传递参数flag }
DataGrid的数据源是dateset_chaxun,数据成员是tickets,数据键字段是“车次”。this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();这行代码的意思就是获取数据键字段,在这个数据网格中数据字段是“车次”。
Response.Redirect(“maipiao.aspx?flag=”+flag);这里面的flag参数传递的就是车次,用户点击“购买”后,系统会跳转到买票页面,那里面的车次字段,起始站和终点站字段系统会自动给它们绑定数据。用户只需要选择开车时间和座位类型等即可。
DataGrid_PageIndexChanged事件是DateGrid控件里面最常用的事件,它的功能是实现分页,用户可以自己定义DateGrid里面每页显示多少行(查询模块里面设置的是每页显示10行),当查询结果超过设定的行数时,DateGrid底线会出现分页符(“下一页”或者“1.2?”),点击它可以显示其与查询结果,它的代码如下:
this.sqlDataAdapter_tickets.Fill(this.dschaxun); //重新填充数据集合 this.DataGrid1.CurrentPageIndex=e.NewPageIndex; //获取新的页面索引 this.DataGrid1.DataBind(); //绑定数据 2.查询功能代码
这里的查询方式有两种:按车次查询和按站点查询。按车次算法比较简单,这里不多讲,主要讲按站点查询。
按站点查询又分为三种方式:按起始站,按终点站,按起始站和终点站组合。 如何区分三种查询方式?这里使用的是判断起始站,终点站文本框里面是否为空,它们有四种组合方式,除去全空外,其余三种刚好对应三种查询方式,
26
判断查询方式的代码如下: if(this.TextBox_qsz.Text.Trim() this.TextBox_zdz.Text.Trim() !=””)
type=”zh”; //起始站和终点站都不为空,查询类型为 “zh” else if(this.TextBox_qsz.Text.Trim() !=””) //按起始站查询 type=”sfz”;
else if(this.TextBox_zdz.Text.Trim() !=””) // 按终点站查询 type=”zdz”; if(type!=null) {
this.displaycc黑龙江(type); //调用查询车次函数 }
查询车次函数displaycc黑龙江的代码比较长,这里不具体给出,只讲一下查询原理。调用查询函数时要传递查询方式参数(type)过去,如this.displaycc黑龙江(type),displaycc黑龙江函数的内部执行结构是这样的:用case语句进行判断type的值,如果type=”sfz”,即按起始站进行查询,如果type=”zdz”,即按终点站进行查询,这两种查询方式原理其实是一样,它以出发站(到达站)作为查询条件,去搜索tikcetsinf表,把查询结果填充到dateset (数据集)中去,如果dateset .tables[0].rows.count >1,进行循环取。
每一行的车次字段值,然后以车次为查询条件对tickets表进行查询,把该车次的基本信息展示给用户。
组合查询(即有起始站又有终点站)方式:假如我们要查询从成都到北京西的车次信息,首先把ticketsinf表中的车次,出发站,到达站三个字段全部查询出来放到数据集的一张表里面,假如这张表名为table,用count纪录table表的行数。执行循环:(for i=0;i 如果table表里面的第一行的出发站等于成都,作标记flag1=1,并纪录该 27 !=”” && 行的车次,然后再判断该行的到达站是否等于北京西,如果该行的到达站也等于北京西站,作标记flag2=2,如果flag1=1并且flag2=2,以该行的车次为条件对tickets表进行查询,把查询结果展示给用户;如果第一行没有满足条件,继续判断下一行纪录,假如某一行的出发站等于成都,但是它的到达站不等于北京西,而在下面的某行找到一行到达站等于北京西,这时候就要判断车次,因为ticketsinf表中纪录很多车次的信息,如果不判断车次是否相等,会出现查出错。如果结果在table都查询完后仍没有满足flag1=1并且flag2=2 ,它们的车次相等,则说明没有用户要的车次信息。 3.8个人资料模块 个人资料模块位于系统主界面上,用户登陆系统后,可以对自己的个人信息进行修改,但是用户自己不能修改用户类型和代售点编号。 3.9站内新闻模块 火车站如果发布了最新通知或者新闻,代售点或企业单位通过新闻模块了解最新的业内信息和一些车次变动信息。这里说的新闻模块是指用户看到的新闻页面,具体新闻的添加删除会在后面的用户管理里面详细谈到。 用户打开站内新闻页面时,页面就已经有新闻显示出来,比如今日要闻栏里显示的今天的所有新闻,以往新闻里显示的是所有的新闻纪录。新闻栏里显示的是今日新闻的第一条新闻,这些都是不用用户操作 直接显示出来的,所以它们的代码都是在Page_load事件里面执行的。 今日要闻的实现原理是:从系统获取今天的日期,以它为条件所有数据库里的xinwen表(新闻表),然后把查询结果的新闻标题绑定到DataGrid_jryw(今日要闻_数据网格),这里要注意的是,从xinwen表里面查询出来的新闻标题可能很长,如果直接绑定到DataGrid_jryw中去可能界面比较乱,所以在绑定之前先要对查询结果进行处理,这里是利用循环语句把查询结果所有的行都执行 28 substring(0,10)方法,这样标题就只显示前10个字符,substring是string()自带的方法。 以往新闻的代码原理和上面一样,不同的是它无条件的执行查询语句,即查询所有新闻内容。 3.10意见反馈模块 该功能在系统的主界面上,它的作用是把用户在使用系统中遇到的问题,或者意见建议及时地反馈给管理员,为系统的升级和完善提供参考意见。意见反馈模块被调用时是以窗口形式出现在主界面上的。用户填写好意见标题和内容后,点击“提交”按钮,用户意见将被保存到liuyan表(留言表)里面。 3.11用户管理模块 前面介绍的模块都是面向用户的,普通用户登录系统时,用户管理模块是不可见的,当登录用户名为admin时,用户管理模块可见,它的主要功能是方便管理员管理整个系统,当本系统第一次安装运行后,管理员要做的操作是进入“更新车次”模块,建立基本车次信息表和车次详细信息表,只有这些数据添加后,本系统才可用。用户管理模块包括以下子模块:管理用户,查询剩余票,更新车次,新闻管理,信息反馈,销售情况查询。 3.12管理用户模块 管理用户模块的主要的功能便于系统管理员对系统注册用户进行查询,修改或者增加新的用户。查询子功能分为按用户名模糊查询和查询所有用户;这里的修改用户信息功能和系统主页面里的修改用户信息功能不太一样,管理员在这里可以修改用户的所有信息,包括用户类型和编号等。 用户的查询结果是绑定到数据网格DataGrid(数据网格)上,由于用户信息字 29 段很多,DataGrid不能把用户信息全部显示在一行,所有这里就在DataGrid里的每一行后面增加了一个“详细/编辑”按钮,点击它可以弹出一个新窗口,在新的窗口里面可以看到用户的详细信息,还可以对用户信息进行修改。 统计在线人数的实现原理如下: 在Global.aspx里设置一个变量counter用来存储当前在线用户数量,当有用户进入系统后会触发Session_Start事件,counter加一;当有用户离开系统后会触发Session_End事件,counter减一,这样就可以实现统计在线人数的功能。 具体代码如下: protected void Session_Start(Object sender, EventArgs e)//当有用户进入系统后counter加一 { counter++; } protected void Session_End(Object sender, EventArgs e)//当用户离开系统后counter加减一 { counter--; } 3.13查询剩余票模块 如果管理员想知道哪趟车现在的车票剩余情况,可以在这里进行查询。这个模块里面的查询方式分为两种:按车次查询和查询所有车次。这个模块功能相对比较简单,它只是涉及到一些数据库查询操作。 按车次查询代码如下: 30