2003-3-29----Guestbook开发文档,和和。 -------By Ganz http://ganz.my163.com
该留言簿没有管理功能,没有删除、修改等操作。如果要做怎么办?手工打开数据库进行操作或是自行添加相关的模块。
文件说明:
index.ASPx
index.aspx.VB 留言簿显示模块
giveme.aspx
giveme.aspx.vb 留言模块。
Img/ 存放头像的目录
头像以数字序号命名,从1-60共60个,如第一个头像的文件名为1.gif,如果要添加新的头像,文件名从61开始。并修改GIVEME.ASPX.VB中的相关代码。
Abc.mdb 数据库文件 (ACCESS2000格式)
数据库中LY表是存放留言内容的,字段定义自己打开数据库看啦。
整个留言簿前后大概花了7天吧。
一、在没vs.Net前,最先完成留言模块giveme.aspx。历时2天。用editplus编写,当时手上除了SDK外,对。NET一无所知。
首次Page_load时,初始化头像选择控件—ddlpic的值。并设定默认的头像为0。(如果添加了新的头像,将60这个值增大。)
For i = 1 To 60
ddlpic.Items.Add(i.ToString)
Next
ddlpic.SelectedIndex = 0
End If
在留言者提交内容信息前,用了Requiredfieldvalidator控件验证是否填写了内容。否则会有相应的提示。
验证成功后,调用send_click过程。
1. 首先,对留言的内容做处理,禁止使用HTML标签。
。。。。。。
stxtname = HTMLEncode(txtname.Text)
stxtaddr = HTMLEncode(txtaddr.Text)
stxtQQ = HTMLEncode(txtqq.Text)
stxtemail = HTMLEncode(txtemail.Text)
stxthttp = HTMLEncode(txthttp.Text)
stxtcontent = HTMLEncode(content.Text)
。。。。。。
htmlEncode过程取自动网论坛中的相关代码。
2. 产生一条插入的sql语句,调用CreateMyOleDbCommand过程,将留言内容保存到数据库中。
Public Sub CreateMyOleDbCommand(ByVal myExecuteQuery As String, _
ByVal myConnectionString As String)
Dim myConnection As New OleDbConnection(myConnectionString)
定义连接。
Dim myCommand As New OleDbCommand(myExecuteQuery, myConnection)
定义连接的command。因为只是单纯的执行SQL语句,只需一个COMMAND就可完成。
myCommand.Connection.Open()
打开连接。使用COMMAND前必须做此操作,这不同于使用数据适配器,会自动的打开连接和关闭连接。
myCommand.ExecuteNonQuery()
执行SQL语句。
myConnection.Close()
关闭连接。
End Sub
CreateMyOleDbCommand需要两个字符串参数:
myExecuteQuery:需要执行的SQL语句,
myConnectionString:数据库的连接字符串。
在本留言簿中,因为数据库使用ACCESS,连接字符串为
Dim mySelectConn As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("abc.mdb")
3. 保存后,返回index.aspx 。
Response.Redirect("index.aspx")
二、index.aspx
显示模块经历2次大的变动。
首次:当时并不知道可以使用数据绑定控件,DATALIST,REPEATER等。用DataGrid取得数据源后,靠循环语句和动态添加TABLE,TABLECELL ,TABLEROW等完成留言内容的显示。虽然使用DataGrid(主要是VIEWSTATE太大了)速度很慢,但不用写分页的代码,还凑和。
看了喳喳鸟用C#写的留言簿后,朋友MAIL了个用REPEATER的例子。怎样修改显示部分有了初步的计划。
gar.Fill(myDataSet, i, iPageSize, "soft"),用OleDbDataAdapter填充DataSet时,不必读取整张表的记录,可以指定记录的起始行数(I)和要取的记录数(PAGESIZE);不必再动态添加控件了,使用repeater就可完成相等同的操作。repView.DataSource = myDataSet.Tables("soft")
分页:参照ASP中的分页代码。
1、 先说怎样完成分页的。首先取得留言总的记录数,将记录数保存到一个隐藏的LABEL中(和和,还可以用VIEWSTATE,SEESION来完成。待在CSDN里面绝对有收获。)。取得记录数,除以每页显示的记录数PageSize,填充dropdownlist控件-DLPAGE。
i = myDataSet.Tables("soft").Rows.Count
lblRecordCount.Text = i.ToString
j = i
i = i / iPageSize
If (i * iPageSize) > j Then i = i - 1
For j = 0 To i
dlPage.Items.Add(j.ToString)
Next
另外,还隐藏了一个label控件,lblPageIndex,用于保存当前显示的分页数。
完成过程: 在单击分页按钮或是DLPAGE选择分页时,设置控件lblPageIndex的值,并调用数据绑定过程dgDataBind()。
A.取得要显示分页的记录 。
i = CInt(lblPageIndex.Text) * iPageSize
Dim myDataSet As New DataSet()
Dim gconn As New OleDbConnection(constr)
Dim gar As New OleDbDataAdapter("select * from ly order by 时间 desc", gconn)
If (i + iPageSize) > CInt(lblRecordCount.Text) Then
gar.Fill(myDataSet, i, CInt(lblRecordCount.Text) - i, "soft")
Else
gar.Fill(myDataSet, i, iPageSize, "soft")
End If
I:起始记录行数。
B、绑定REPEATER。
repView.DataSource = myDataSet.Tables("soft")
repView.DataBind()
数据绑定。
gconn.Close() 关闭打开的连接。
(这一句好像是没必要,使用数据适配器填充数据时,会自动找开连接,和关闭连接。)
dlPage.SelectedIndex = CInt(lblPageIndex.Text)
2、 REPVIEW数据绑定后,前端显示数据。
<asp:repeater id="repView" runat="server" EnableViewState="False">
< ItemTemplate>
。。。。。。。。
<%# databinder.Eval(Container,"dataitem(5)") %>
。。。。。。。。
</ ItemTemplate>
</repeater>
<%# databinder.Eval(Container,"dataitem(5)") %> 这句还可以这样写:
<%#databinder.Eval(Container.dataitem,"留言内容")%>
整个留言簿的运作大致如此,能运行,没有大的错误。两周后再来看这些代码 ,觉得很乱,变量和控件的定义没有规范。许多语句可以改进,如取得留言总的记录数,用”select count(*) from ly”就可以了,不必取整张表的记录,再来统计;分页技术上,还有欠缺。