一个综合性的例子

本节的任务是在上一节分页显示后台数据的基础上,加上编辑和删除订单的功能:

单击删除链接,可以删除对应的订单,单击编辑链接,可以编辑对应的订单:

编辑或删除订单后,可以返回原来的分页:

知识准备

用户单击“编辑”链接,后台如何知道要编辑哪一个订单呢? 编辑完成后,又怎么知道返回哪一个页面呢?

我们可以在表单中插入隐藏字段,来传递主键和页码,参考:

在表单中插入标记数据

不过本节我们不采用这个方法,我们采用get方式来传递主键和页码,参考:

另一种数据提交方式

Values、PostValues和GetValues

完整代码

这是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事件代码


本页地址:http://www.foxtable.com/mobilehelp/topics/0037.htm