一个综合性的例子
本节的任务是在上一节分页显示后台数据的基础上,加上编辑和删除订单的功能:
单击删除链接,可以删除对应的订单,单击编辑链接,可以编辑对应的订单:
编辑或删除订单后,可以返回原来的分页:
知识准备
用户单击“编辑”链接,后台如何知道要编辑哪一个订单呢? 编辑完成后,又怎么知道返回哪一个页面呢?
我们可以在表单中插入隐藏字段,来传递主键和页码,参考:
不过本节我们不采用这个方法,我们采用get方式来传递主键和页码,参考:
完整代码
这是HttpRequest事件的完整代码,由于包括分页、编辑、删除三部分的代码,所以代码有点长,后面会对关键代码进行解释:
Dim
sb As
New
StringBuilder
Select
Case e.Path
Case
"list.htm"
'分页显示
Dim page
As Integer
= 0
'默认page为0,显示第一页
Dim
pageRows As
Integer = 10
'每页10行
If e.GetValues.ContainsKey("page")
Then
'如果地址中有page参数
Integer.TryParse(e.GetValues("page"),
page)
'提取page参数
End If
Dim
StartRow As
Integer = page *
pageRows
'此页第一行
Dim EndRow
As Integer
= (page + 1)
* pageRows - 1
'此页最后一行
Dim cmd
As New
SQLCommand
cmd.ConnectionName
= "orders"
'记得设置数据源名称
cmd.CommandText
= "Select Count(*) From {订单}"
Dim Count
As Integer
= cmd.ExecuteScalar()
'获取总的行数
cmd.CommandText
= "Select *, [数量]*[单价]*(1-[折扣])
As 金额
From (Select Row_Number() Over(Order by [日期]
desc) As RowNum, * From
订单)
As a "
cmd.CommandText
= cmd.CommandText
& " Where RowNum
>= " &
StartRow & "
And RowNum <= " &
EndRow
Dim
dt As
DataTable = cmd.ExecuteReader
'获取该页数据
Dim nms()
As String =
{"产品","客户","数量","单价","折扣","金额","日期"}
sb.AppendLine("<Table
border='1'>")
sb.AppendLine("<caption>订单浏览<caption></br>")
sb.Append("<tr>")
For Each
nm As
String In
nms
sb.Append("<td>"
& nm
& "</td>")
Next
sb.Append("<td></td>")
sb.Append("<td></td>")
sb.AppendLine("</tr>")
For Each
r As
DataRow In
dt.DataRows
sb.Append("<tr>")
For Each
nm As
String In
nms
sb.Append("<td>"
& r(nm)
& "</td>")
Next
sb.Append("<td><a
href='edit.htm?id=" &
r("_Identify")
& "&page="
& page
&
"'>编辑</a></td>")
sb.Append("<td><a
href='delete.htm?id=" &
r("_Identify")
& "&page="
& page
&
"'>删除</a></td>")
sb.AppendLine("</tr>")
Next
sb.AppendLine("</Table></br></br>")
If page
> 0 Then
sb.Append("<a
href='list.htm?page=" &
page - 1
&
"'>上一页</a>
")
End If
If
EndRow < Count -1
Then
sb.Append("<a
href='list.htm?page=" &
page + 1
&
"'>下一页
</a>" )
End If
e.WriteString(sb.ToString)
Case
"delete.htm"
'删除订单
If
e.GetValues.ContainsKey("id")
AndAlso e.GetValues.ContainsKey("page")
Then
Dim
cnt As
Integer
cnt =
DataTables("订单").SQLDeleteFor("[_Identify]
= " & e.GetValues("id"))
If cnt
> 0 Then
sb.AppendLine("删除成功!</br></br>")
Else
sb.AppendLine("删除失败!</br></br>")
End If
sb.Append("<a
href='list.htm?page=" &
e.GetValues("page")
&
"'>返回列表</a>"
)
e.WriteString(sb.ToString)
Else
e.WriteString("糟糕,可能出错了")
End If
Case
"edit.htm"
'编辑订单
If
e.GetValues.ContainsKey("id")
AndAlso e.GetValues.ContainsKey("page")
Then
Dim
dr As
DataRow =
DataTables("订单").SQLFind("[_Identify]
= " & e.GetValues("id"))
If dr
Is Nothing
Then
e.WriteString("此订单不存在,可能已经被其他用户删除!")
Return
End If
If
e.PostValues.Count
= 0 Then
'生成编辑页面
sb.appendLine("<form
action='edit.htm?id=" &
e.GetValues("id")
& "&page="
& e.GetValues("page")
& "' method='post'
id='form1'
name='form1'>")
sb.appendLine("产品:
<input name='cp' id='cp' value='"
& dr("产品")
& "'><br/><br/>")
sb.appendLine("客户:
<input name='kh' id='kh' value='"
& dr("客户")
& "'><br/><br/>")
sb.appendLine("雇员:
<input name='gy' id='gy' value='"
& dr("雇员")
& "'><br/><br/>")
sb.appendLine("单价:
<input type='number' name='dj' id='dj' step='0.1' value='"
& dr("单价")
& "'><br/><br/>")
sb.appendLine("折扣:
<input type='number' name='zk' id='zk' step='0.01' value='"
& dr("折扣")
& "'><br/><br/>")
sb.appendLine("数量:
<input type='number' name='sl' id='sl' value='"
& dr("数量")
& "'><br/><br/>")
sb.appendLine("日期:
<input type='date' name='rq' id='rq' value='"
& dr("日期")
& "'><br/><br/>")
sb.appendLine("<input
Type='submit' name='Sumbit' id='Sumbit' value='确定'>")
sb.appendLine("</form>")
e.WriteString(sb.ToString)
Else
'获取用户提交的数据
Dim
inms() As
String = {"cp","kh","gy","dj","zk","sl","rq"}
'输入框名称数组
Dim cnms()
As
String
= {"产品","客户","雇员","单价","折扣","数量","日期"}
'列名数组,注意列名和输入框必须一一对应,位置不能错乱
For i As Integer = 0 To inms.Length -1
If
e.PostValues.ContainsKey(inms(i))
Then
'必须判断,因为PostValues集合只包括已经输入的值
dr(cnms(i))
= e.PostValues(Inms(i))
End
If
Next
dr.Save()
'用SQLAddNew增加的行,必须保存一下,否则会被丢弃.
sb.AppendLine("编辑订单成功!
<br/><br/>")
sb.AppendLine("<a
href='list.htm?page=" &
e.GetValues("page")
&
"'>返回列表</a>")
e.WriteString(sb.ToString)
End If
Else
e.WriteString("糟糕,可能出错了")
End
If
End
Select
分页显示的代码和上一节基本一样,只是为每一行增加了编辑和删除链接,合成这两个链接的代码为:
sb.Append("<td><a
href='edit.htm?id=" &
r("_Identify")
& "&page="
& page
&
"'>编辑</a></td>")
sb.Append("<td><a
href='delete.htm?id=" &
r("_Identify")
& "&page="
& page
&
"'>删除</a></td>")
下面是第5页(页面编号4)中主键为176的行对应的链接:
<a href='edit.htm?id=176&page=4'>编辑</a>
<a href='delete.htm?id=176&page=4'>删除</a>
表示要编辑或删除的订单的主键是176,当前页面编号是4。
例如HttpRequset事件收到访问请求“delete.htm?id=176&page=4”,从中提取出主键176和页面编号4,删除主键为176的订单后,再合成一个链接:
sb.Append("<a href='list.htm?page=" & e.GetValues("page") & "'>返回列表</a>" )
这样用户单击这个连接,即可返回原来的分页。
再例如HttpRequset事件收到访问请求“edit.htm?id=176&page=4”后,从中提取出主键176和页面编号4,然后从后台找出主键为176的行,根据 该行的内容生成编辑表单,注意我们定义表单的代码:
sb.appendLine("<form action='edit.htm?id=" & e.GetValues("id") & "&page=" & e.GetValues("page") & "' method='post' id='form1' name='form1'>")
这段代码合成的内容类似:
<form action='edit.htm?id=176&page=4' method='post' id='form1' name='form1'>
当用户编辑完成,单击确定按钮时,将输入的值发送到到"edit.htm?id=176&page=4"。
HttpRequset收到这个请求后,e.PostValues.Count属性会大于0,系统知道用户本次访问
目的是提交编辑结果。
HttpRequset事件找出主键为176的行,将接收到的值存储到对应的列,并生成一个链接,让用户可以返回原来的页面:
sb.AppendLine("<a
href='list.htm?page=" &
e.GetValues("page")
&
"'>返回列表</a>")
重要提示:所有的浏览器都可以查看网页源码,通过查看网页源码,有助于我们学习理解和排查错误。
增加订单功能
为了让代码不至于太长,上面的例子,只有编辑和删除订单的功能,没有增加订单的功能。
实际上,增加订单功能实现起来更简单,而且我们之前已经讲述过了,大家自己将这部分的代码整合进来即可,参考:
一个简单的录入功能
简化HttpRequest事件代码
这是到目前为止,我们写的最长的一段HttpRequest事件代码,用了三个页面,实现了分页显示、增加订单、删除订单的功能。
建议大家一个页面做成一个函数,在HttpRequest不要涉及具体功能,只负责调用相关函数,参考:简化HttpRequest事件代码