
图11 打印校对表图
其实现原理是将查询出来的结果集通过流文件的形式写入到浏览器并让客户端自行下载打印,输出的文档格式主要是Doc形式。下面是一个实现数据流输出的关键函数:
Private Function PrintList()
Dim myYear As String = DropDownListYear.SelectedValue
Dim CmdText As String = "select [id],subjectid,iif(subjecttype=1,'指南课题','自选课题')as subjecttype,iif(sciencetype=1,'人文学科','经济学科')as sciencetype ,subjectName,chiefman,workdepartment ,officetel,HomeTel,Address,PostCode,Member1 ,Member2 ,Member3 ,Member4 ,Member5 ,Member6 ,Member7 ,Member8 ,Member9 ,Member10 From [Report] where Status=false "
CmdText &= " and year([year])= "
CmdText &= " '" & myYear & "' "
Dim da As OleDbDataAdapter = New OleDbDataAdapter(CmdText, myConnection)
Dim ds As DataSet = New DataSet
da.Fill(ds, "myTable")
Dim dt As DataTable = ds.Tables("myTable")
Dim sw As System.IO.StringWriter = New StringWriter
sw.WriteLine("***科委" & myYear & "年科研申报校对表")
sw.WriteLine("======================================================================")
sw.WriteLine("")
For Each dr As DataRow In dt.Rows
sw.WriteLine("编 号:" & dr("subjectID") & " 类别:" & dr("subjectType") & " 学科分类:" & dr("scienceType"))
sw.WriteLine("题 目:" & dr("subjectName"))
sw.WriteLine("负责人:" & dr("chiefman") & " 工作单位:" & dr("workdepartment")& " 办:" & dr("officetel") & " 宅:" & dr("homeTel"))
sw.WriteLine("住 址:" & dr("Address") & " 邮编:" & dr("PostCode"))
sw.WriteLine("成 员:" & dr("Member1") & " " & dr("Member2") & " " & dr("Member3") & " " & dr("Member4") & " " & dr("Member5") & " " & dr("Member6") & " " & dr("Member7") & " " & dr("Member8") & " " & dr("Member9") & " " & dr("Member10"))
sw.WriteLine("")
Next
sw.Close()
Response.AddHeader("Content-Disposition", "attachment; filename=" & myYear & "notCheck.doc")
Response.ContentType = "application/ms-word"
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312") '输出的字符格式为"GB2312"
Response.Charset = ""
Response.Write(sw)
Response.End()
End Function
这样,客户端在接收数据之后,自动以word的形式提示保存,管理员就可以下载该文件自行进行打印处理,这样做的好处是能够减轻服务器的负担,用户对文档的处理有较大的自由度。
2)申报信息校对(Reportverify.aspx)
申报信息校对表是保证进入系统的相关数据都是真实可信的,否则本系统也就失去了使用的意义,它是保证所有申报信息的真实性、准确性的重要环节,为此,系统管理员必须在该年度申报的期限内对所有已提交申报的信息进行细致的核对。效果如图12所示。

图12 管理员校对申报信息截图
其实现原理是将所有未对的信息查询出来,然后进行批量校对或者单独校对,批量校对工作方式能提高管理员的办公效率,使得申报者能在最短的时间内查询看到自己已申报信息的校对情况,一旦通过校对,申报者将不能再修改自己的申报信息,即使是在申报期限之内。管理校对的具体实现步骤如下:
Private Sub myDataGrid_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles myDataGrid.UpdateCommand
Dim UpdateCmd As String = "Update Report Set Status=@Status where ID=@ID"
Dim MyCommand As OleDbCommand = New OleDbCommand(UpdateCmd, myConnection)
MyCommand.Parameters.Add(New OleDbParameter("@Status", OleDbType.VarChar))
Dim CurrentDropDownList As DropDownList = e.Item.FindControl("DropDownList_status") ' CType(e.Item.Cells(8).Controls(0), DropDownList)
MyCommand.Parameters("@Status").Value=CurrentDropDownList.SelectedItem.Value
MyCommand.Parameters.Add(New OleDbParameter("@ID", OleDbType.Integer))
MyCommand.Parameters("@ID").Value = myDataGrid.DataKeys(CInt(e.Item.ItemIndex)) ' myDataGrid.DataKeys(CType(e.Item.ItemIndex, Integer))
If CurrentDropDownList.SelectedItem.Value = "" Then
Response.Write("<script>alert('提示:\n\n 请你选择校对情况!');</script>")
Else
Try
myConnection.Open()
MyCommand.ExecuteNonQuery()
Response.Write("<script>alert('成功:\n\n 本次校对成功!');</script>")
Catch Ex As OleDbException
Response.Write(Ex.Message.ToString)
Finally
MyCommand.Dispose()
myConnection.Close()
myDataGrid.EditItemIndex = -1
DataGridDataBind()
End Try
End If
End Sub
上面的代码主要是通过使用一个下拉列表控件来实现已校对或未校对两种情况的选择的,凡是校对成功时,管理员能够看到校对结果。
3)申报信息汇总(ReportPostSum.aspx)

图13 Web方式下打印汇总结果截图
申报信息汇总是得到年度汇总结果的重要手段,本系统提供了两种得到汇总结果的方式,一是像前面所说的那样,直接用Word文档导出下载的方式,另一种是直接通过Web打印的方式实现。下面就后一种实现方法作详细解释,其打印预览效果如图13所示。
其实现原理是借助IE浏览器的WebBrowser控件函数接口来实现打印和打印预览操作。
这里需要借助于一个通用的Web打印类来实现数据的加载和打印输出,核心代码如下。
Imports System.Text
Public Class PrintClass
Inherits System.Web.UI.Page
'PrintClass类的摘要说明
'功能:拼出要打印的表
'参数:ds为DATASET型,dg为DATAGRID型
'技术:使用IE浏览器的WebBrowser控件函数接口来实现打印、打印预览操作
'打印 WebBrowser1.ExecWB(6,1)
'打印设置 WebBrowser1.ExecWB(8,1)
'打印预览 WebBrowser1.ExecWB(7,1)
'直接打印WebBrowser1.ExecWB(6,6)
Public Sub New()
' TODO: 在此处添加构造函数逻辑
End Sub
Public Overloads Function DGPrint(ByVal ds As DataSet) As String
Dim myDataTable As New DataTable
myDataTable = ds.Tables(0)
Dim myRow As Integer = myDataTable.Rows.Count
Dim myCol As Integer = myDataTable.Columns.Count
Dim sb As New StringBuilder
Dim colHeaders As String = "<html><body>" + "<object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'VIEWASTEXT></object>" + "<table><tr>"
For i As Integer = 0 To myCol - 1
colHeaders += "<td>" + myDataTable.Columns(i).ColumnName.ToString() + "</td>"
Next i
colHeaders += "</tr>"
sb.Append(colHeaders)
For i As Integer = 0 To myRow - 1
sb.Append("<tr>")
Dim j As Integer
For j = 0 To myCol - 1
sb.Append("<td>")
sb.Append(myDataTable.Rows(i)(j).ToString().Trim())
sb.Append("</td>")
Next j
sb.Append("</tr>")
Next i
sb.Append("</table></body></html>")
colHeaders = sb.ToString()
colHeaders += "<script languge='javascript'>WebBrowser.ExecWB(7,1); window.opener=null;window.close();</script>"
Return colHeaders
End Function
End Class
以上代码的本质其实还是调用客户端的功能函数WebBrowser.ExecWB(7,1),实现打印。
4)申报时间设置(ReportTimeSet.aspx)
申报时间设置是进行课题申报活动中不可缺少的条件,在每一次申报之前,都必须有管理员设置本年度的申报开始时间和截止时间,以及年度完成课题后的汇报完成情况的开始时间和截止时间。界面如图14所示:

图14 管理员申报时间设置
其核心代码如下:
Imports System.Data.OleDb
Imports System.Configuration
Public Class ReportTimeSet
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码
#End Region
Dim myConnection As OleDbConnection=New
OleDbConnection(ConfigurationSettings.AppSettings("ConnectionStr"))
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Check As CheckUser = New CheckUser
If (Check.CheckAdmin = "False") Then
Response.Write("<script>alert('抱歉:\n\n您尚未登录,请登录!');location.href('login.aspx');</script>")
End If
If Not Page.IsPostBack Then
LoadMyGrid()
TableModifyPanel.Visible = False
End If
End Sub
Private Sub btAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAdd.Click
TableSetPanel.Visible = True
TableModifyPanel.Visible = False
End Sub
Private Sub btnSubmit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSubmit.Click
Try
If (Calendar_poststart.DateTime).CompareTo(Calendar_postend.DateTime) < 0 Then
If (Calendar_postend.DateTime).CompareTo(Calendar_finishstart.DateTime) < 0 Then
If (Calendar_finishstart.DateTime).CompareTo(Calendar_finishend.DateTime) < 0 Then
Dim mySQL As String = "insert into
ExpiredTime([year],postStart,postEnd,finishStart,finishEnd)
values(@year,@postStart,@postEnd,@finishStart,@finishEnd)"
Dim myCommand As OleDbCommand
myCommand = New OleDbCommand(mySQL, myConnection)
myCommand.Parameters.Add(New OleDbParameter("@year", OleDbType.VarChar))
myCommand.Parameters("@year").Value = Select_year.Value
myCommand.Parameters.Add(New OleDbParameter("@postStart", OleDbType.Date))
myCommand.Parameters("@postStart").Value = Calendar_poststart.DateTime
myCommand.Parameters.Add(New OleDbParameter("@postEnd", OleDbType.Date))
myCommand.Parameters("@postEnd").Value = Calendar_postend.DateTime
myCommand.Parameters.Add(New OleDbParameter("@finishStart", OleDbType.VarChar))
myCommand.Parameters("@finishStart").Value = Calendar_finishstart.DateTime
myCommand.Parameters.Add(New OleDbParameter("@finishEnd", OleDbType.VarChar))
myCommand.Parameters("@finishEnd").Value = Calendar_finishend.DateTime
Try
myConnection.Open()
myCommand.ExecuteNonQuery()
Response.Write("<script>alert('成功:\n\n本次时间设置成功!')</script>")
Catch ex As OleDbException
Response.Write("<script>alert('提示:\n\n系统中存在该年份的时间设置,请不要重复!')</script>")
Finally
myCommand.Dispose()
myConnection.Close()
LoadMyGrid()
End Try
Else
Response.Write("<script>alert('提示:\n\n[完成]开始时间 不能大于 [完成]截止时间')</script>")
End If
Else
Response.Write("<script>alert('提示:\n\n[申报]截止时间 不能大于 [完成]开始时间')</script>")
End If
Else
Response.Write("<script>alert('提示:\n\n[申报]开始时间 不能大于 [申报]截止时间')</script>")
End If
Catch ex_Times As System.ArgumentOutOfRangeException
Response.Write("<script>alert('提示:\n\n你提交的日期格式不正确,请正确输入日期')</script>")
End Try
End Sub
End Class
五、结语
数据库备份时没有采用数据压缩技术,由于服务器空间的限制,当数据量增大时,将不允许创建太多的还原点;系统后台的管理菜单采用静态的方法实现,在一定程度上加重了程序开发的负担,在日后的功能扩展时将造成不便;没有考虑到程序的执行效率,在提高应用程序的性能方面做得不够。
以后的改进主要涉及到以下几个方面:提升应用程序的性能和数据的安全性; 进一步美化页面;扩展现有的功能,并为其他应用系统实现有效的协同和集成。
|