Visual Basic .Net (VB.Net) 程式語言案例學習 (03. 場地預約系統)
Visual Basic .Net (VB.Net) 程式語言案例學習 (03. 場地預約系統)¶
3.1 問題¶
這是一間學校單位的場地預約系統,由於是臨時的構想,想把原本紙上作業放置在網路上供教師們填選,以節省人力資源,到時候只需要定時派工讀生至網頁上查詢列印,即可做到管理的需求。
在一次的會議上臨時的想法,由該處室長官提出,希望能夠透過網頁讓學校教師,可以預約場地,而不用提出人力專門負責登記預約,教師也不必透過電話或是親自到訪登記,強調必須能夠有月曆供參考,避免教師誤填,還要有避免衝堂的機制,才不會造成衝突。
介面要越簡單越好,教師並不想打太多資料,而工讀生也要能很方便的操作。
3.2 需求¶
由於是臨時的想法,我們掌握先求有再求好的概念,因為身為資訊人員,與使用者的角度是不同的,使用者是希望透過資訊人員解決目前的問題,他們不會像資訊人員能夠考慮到擴充性、效率、介面、…等等的問題。而且這類的臨時提案,很有可能隨時更改,因為臨時的提案,很有可能連需求者都無法完全構思或者是完全描述,在還沒有看到成品之前,需求者是沒有概念可言的。
那身為資訊人員應如何掌握重點呢?首先由數據下手,全校教職員約三百人,會使用到場地的約一百人,而並不是每一堂都要使用到特殊場地,因此粗估約有五十人會在每一星期做預約,實際上更少,因為場地數量也沒有這麼多。
而後從介面思考,簡單的介面就是資料量少且排版順暢,依據使用者瀏覽的概念,我們將網頁切割成左右兩塊,左邊是控制區,右邊是資料區及填表區,如此就不會太複雜。而瀏覽者一般都是由上往下閱讀,由左往右閱讀,為求控制功能概念能夠順利傳達,我們在命名功能項目時必須簡潔有力。在選單的部分,幾乎只讓使用者透過點選的方式操作即可,不要讓使用者輸入太多資料。
因此我們的思考模式是先由模組再到介面,而需求者的思考模式是先由介面再到功能。這兩者思考方向差距很大,軟體工程雖然有提出解決的方法,簡單的說就是透過使用者不斷的回饋,進而修正問題,拉近開發者與需求者之間的距離。但是實際面來看,這種臨時的提案實在沒有必要這麼做,不如快速解決以達效率,然後將時間擺放在真正的工作上,所以要速戰速決。
方法就是先拉到需求者的思考模式,記住需求者所提的任何名詞或是動名詞,例如:月曆、衝堂、誤填。能夠說出名詞的部分,就是需求者具有明確概念的部分。以此為設計的出發點大約就有七八成的把握了。其他需求者說不清楚的,例如:越簡單越好,我們怎知甚麼樣的設計對需求者才叫做簡單,像這類的問題,因為連需求者都不清楚了,所以我們要自己做分析,首先畫面要能夠明確,因此功能命名要以需求者熟悉的語言來呈現,需求者看得懂就代表越具親和力,他也比較敢下去嘗試。操作步驟越少越好,太多的操作會讓需求者混淆,所以儘量不要讓需求者有機會輸入文字,用點選的方式比較容易,而且對程式來說也不必做輸入錯誤的判斷,這是雙贏的策略。
表格 3‑1 「場地預約系統」系統需求表
| 版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
|---|---|---|
| 能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
| 使用日曆選擇日期。 | 能夠將預約表列印出來。 | |
| 日曆要能夠標示節假日。 | 教師能夠自我統計預約使用情形。 | |
| 系統要能判斷或避免衝堂。 | ||
| 教師與管理者要有帳號及密碼才能登入。 | ||
| 管理者可以線上新增、刪除、修改資料。 | ||
| 不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
| 統計預約情形表。 | 可以用拖曳的方式預約。 | |
| 讓學生也能預約。 | 能夠整合到教職員管理系統。 |
表格 3‑2 「場地預約系統」系統目標分析表
| 版本: | 重要 | 不重要 |
|---|---|---|
| 優先 | (重) | (急) |
| 使用日曆選擇日期。 | 系統要能判斷或避免衝堂。 | |
| 日曆要能夠標示節假日。 | 管理者可以線上新增、刪除、修改資料。 | |
| 不急迫 | (輕) | (緩) |
| 教師與管理者要有帳號及密碼才能登入。 | 無。 |
表格 3‑3 「場地預約系統」系統規格表
| 規格項目 | 規格內容 | 備註 |
|---|---|---|
| 首頁 | 顯示日曆及預約情形。 | … |
| 日曆要能夠標示節假日。 | ||
| 教師與管理者要有帳號及密碼才能登入。 | ||
| 管理者頁 | 管理者可以線上新增、刪除、修改資料。 | … |
| 教師頁 | 系統要能判斷或避免衝堂。 | … |
3.3 特色¶
找出重複的功能需求,利用複製的概念,加快製作的速度。
找出重點的關鍵名詞,加以實現,拉近使用者需求與成品的距離。
可應用於場地出租的線上預約系統,例如:公司會議室的預約、大會堂的預約、專業研究室的預約…等等。
3.4 使用工具¶
| 語言 | 軟體 |
|---|---|
| ASP.NET | MS Visual Studio 2005 .NET、MS Access |
3.5 系統架構¶
首先我們區分為控制區及顯示、填表區,這目的是為了求簡潔,依照研究網路瀏覽者的瀏覽習慣如圖3-1。我們將採用右邊的瀏覽模式,這樣是最簡潔的方式。
圖 3‑1 網頁瀏覽順序
如圖3-2網站概念圖就完成了,採用分兩區的模式,儘量的將頁面的架構設計成一樣,這樣也方便擴充以及複製。所以無論是首頁、管理者頁、使用者頁都是採用分兩區的模式。
圖 3‑2 「場地預約系統」網站概念圖
3.6 程式實作¶
由於本程式單獨採用ASP.NET所設計,因此我們先建立共用的資料表連結函式,方便於每個網頁中使用。檔名就命名為OleDbFunction.inc。
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<Script Languate="VB" Runat="Server">
'strSQL 為SQL 敘述,FileName 為資料庫檔名,TableName 為資料表名稱。
Function CreateDataSet(strSQL As String, FileName As String, TableName As String) As DataSet
‘宣告並建立連結字串
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath(FileName)
‘宣告並建立命令以及連接來源資料庫
Dim objCmd As New OleDbDataAdapter(strSQL, ConnString)
‘宣告並建立DataSet
Dim DS As New DataSet()
‘透過命令填滿所要求的資料表
objCmd.Fill(DS, TableName)
‘傳回資料表
CreateDataSet = DS
End Function
</Script>
要如何使用這個函式呢?只需要在網頁原始碼插入以下程式碼即可。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- #include File="OleDbFunction.inc" --> ‘插入這一行 <html>
如圖3-3我們透過Calendar來建立日曆的功能,將其拖曳到網頁上,透過自動格式化就可以設計有漂亮的色彩了,而首頁我們命名為main.aspx。
圖 3‑3
整個首頁的安排如圖3-4,提供登入區及顯示區,登入區透過點選的方式區分管理者與教師;顯示區可顯示日期及目前預約情形。
圖 3‑4
在首頁(main.aspx)的<head>…</head>中間插入以下的程式碼。
<script language="VB" runat="Server">
‘宣告一年的節日名稱陣列
Dim holidays(12, 31) As String
‘載入節日陣列副程式
Sub Load_Holidays()
‘陣列第一個元素是月份,第二個元素是日期
holidays(1, 1) = "*元旦"
holidays(1, 11) = "司法節"
holidays(1, 15) = "藥師節"
holidays(1, 23) = "自由日"
holidays(2, 4) = "農民節"
holidays(2, 14) = "情人節"
holidays(2, 15) = "戲劇節"
holidays(2, 28) = "*和平紀念日"
holidays(3, 1) = "兵役節"
holidays(3, 5) = "童子軍節"
holidays(3, 8) = "婦女節"
holidays(3, 12) = "植樹節"
holidays(3, 17) = "國醫節"
holidays(3, 20) = "郵政節"
holidays(3, 21) = "氣象節"
holidays(3, 25) = "美術節"
holidays(3, 26) = "廣播節"
holidays(3, 29) = "青年節"
holidays(3, 30) = "出版節"
holidays(4, 1) = "愚人節主計節"
holidays(4, 4) = "婦幼節"
holidays(4, 5) = "音樂節"
holidays(4, 7) = "衛生節"
holidays(4, 22) = "世界地球日"
holidays(5, 1) = "*勞動節"
holidays(5, 4) = "文藝節"
holidays(5, 5) = "舞蹈節"
holidays(5, 10) = "珠算節"
holidays(5, 12) = "護士節"
holidays(6, 3) = "禁煙節"
holidays(6, 6) = "工程師節水利節"
holidays(6, 9) = "鐵路節"
holidays(6, 15) = "警察節"
holidays(6, 30) = "會計師節"
holidays(7, 1) = "漁民節公路節稅務節"
holidays(7, 6) = "合作節"
holidays(7, 11) = "航海節"
holidays(7, 12) = "聾啞節"
holidays(8, 8) = "父親節"
holidays(8, 14) = "空軍節"
holidays(9, 1) = "記者節"
holidays(9, 3) = "軍人節"
holidays(9, 9) = "體育節律師節"
holidays(9, 13) = "法律日"
holidays(9, 28) = "教師節"
holidays(10, 6) = "老人節"
holidays(10, 10) = "*國慶紀念日"
holidays(10, 21) = "華僑節"
holidays(10, 25) = "台灣光復節"
holidays(10, 31) = "萬聖節"
holidays(11, 1) = "商人節"
holidays(11, 11) = "工業節地政節"
holidays(11, 17) = "自來水節"
holidays(11, 12) = "醫師節中華文化復興節"
holidays(11, 21) = "防空節"
holidays(12, 5) = "海員節盲人節"
holidays(12, 10) = "人權節"
holidays(12, 12) = "憲兵節"
holidays(12, 25) = "行憲紀念日聖誕節"
holidays(12, 27) = "建築師節"
holidays(12, 28) = "電信節"
holidays(12, 31) = "受信節"
End Sub
‘頁面載入副程式
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
‘設定等級為空
Session("LV") = Nothing
‘載入節日陣列資料
Load_Holidays()
‘避免重複載入BindList_PS()
If Not IsPostBack Then BindList_PS()
‘避免重複載入BindList()
If Not IsPostBack Then BindList()
End Sub
‘載入地點及設定日期
Sub BindList_PS()
‘設定日期,DateString()會根據系統傳回目前日期的值
myCalendar.SelectedDate = DateString()
‘宣告SQL字串變數
Dim strSQL As String
‘設定SQL字串
strSQL = "Select [P-ID],[P-Adds] From [PhotoStudio] "
‘連結資料來源
myRadioButtonList.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "PhotoStudio")
‘連結資料欄位
myRadioButtonList.DataTextField = "P-Adds"
‘連結資料值
myRadioButtonList.DataValueField = "P-ID"
‘綁定資料
myRadioButtonList.DataBind()
‘預設選擇第一個
myRadioButtonList.SelectedIndex = 0
End Sub
‘宣告預約情形表副程式
Sub BindList()
‘宣告SQL字串變數
Dim strSQL As String
‘設定SQL字串
strSQL = "Select [OrderMenu].[O-T_ID],[OrderMenu].[O-B_ID],[OrderMenu].[O-C_ID],[OrderMenu].[O-P_ID],[OrderMenu].[O-Date],[OrderMenu].[O-Time],[Teacher].[T-Name_LN_CHT],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class] " & _
"Where [OrderMenu].[O-Date] Like #" & DateString() & "#" & " And [OrderMenu].[O-P_ID] = " & CLng(myRadioButtonList.SelectedItem.Value) & " And ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] And [OrderMenu].[O-B_ID] = [Book].[B-ID] And [OrderMenu].[O-C_ID] = [Class].[C-ID]) Order By [OrderMenu].[O-Date],[OrderMenu].[O-Time]"
‘設定目前頁面索引
myDataGrid.CurrentPageIndex = 0
‘建立資料來源連結
myDataGrid.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "OrderMenu")
‘將表格來源綁定
myDataGrid.DataBind()
End Sub
‘宣告預約情形表副程式二
Sub BindList2()
‘宣告SQL字串變數
Dim strSQL As String
‘當使用者選擇的日期只有一個時
If myCalendar.SelectedDates.Count = 1 Then
‘設定SQL字串
strSQL = "Select [OrderMenu].[O-T_ID],[OrderMenu].[O-B_ID],[OrderMenu].[O-C_ID],[OrderMenu].[O-P_ID],[OrderMenu].[O-Date],[OrderMenu].[O-Time],[Teacher].[T-Name_LN_CHT],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class] " & _
"Where [OrderMenu].[O-Date] Like #" & DateValue(myCalendar.SelectedDate) & "#" & " And [O-P_ID] = " & CLng(myRadioButtonList.SelectedItem.Value) & " And ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] And [OrderMenu].[O-B_ID] = [Book].[B-ID] And [OrderMenu].[O-C_ID] = [Class].[C-ID]) Order By [OrderMenu].[O-Date],[OrderMenu].[O-Time]"
‘設定表格頁面索引為第一頁
myDataGrid.CurrentPageIndex = 0
‘當使用者選擇的日期超過兩個的時候,也就是選擇一周或一個月的時候
ElseIf myCalendar.SelectedDates.Count > 1 Then
‘宣告起始日的變數
Dim strFirstDate As String
‘宣告結束日的變數
Dim strLastDate As String
‘設定起始日及結束日的變數值
With myCalendar.SelectedDates
strFirstDate = .Item(0)
strLastDate = .Item(.Count - 1)
End With
‘設定SQL字串
strSQL = "Select [OrderMenu].[O-T_ID],[OrderMenu].[O-B_ID],[OrderMenu].[O-C_ID],[OrderMenu].[O-P_ID],[OrderMenu].[O-Date],[OrderMenu].[O-Time],[Teacher].[T-Name_LN_CHT],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class] " & _
"Where [OrderMenu].[O-Date] Between #" & strFirstDate & "# And #" & strLastDate & "# And [O-P_ID] = " & CLng(myRadioButtonList.SelectedItem.Value) & " And ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] And [OrderMenu].[O-B_ID] = [Book].[B-ID] And [OrderMenu].[O-C_ID] = [Class].[C-ID]) Order By [OrderMenu].[O-Date],[OrderMenu].[O-Time]"
End If
‘建立資料來源
myDataGrid.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "OrderMenu")
‘將資料來源與表格綁定
myDataGrid.DataBind()
End Sub
‘當表格有換頁動作時的事件副程式
Sub myDataGrid_PageIndexChanged(ByVal sender As Object, ByVal e As DataGridPageChangedEventArgs)
‘設定新的頁面索引
myDataGrid.CurrentPageIndex = e.NewPageIndex
‘呼叫預約情形表副程式二
Call BindList2()
End Sub
‘當日期選擇有改變時的事件副程式
Sub DayChange(ByVal sender As Object, ByVal e As EventArgs)
‘重設預約情形表的頁面索引為第一頁
myDataGrid.CurrentPageIndex = 0
‘呼叫預約情形表副程式二
Call BindList2()
End Sub
‘地點選擇有改變時的副程式
Sub PhotoStudioChange(ByVal sender As Object, ByVal e As EventArgs)
‘重設預約情形表的頁面索引為第一頁
myDataGrid.CurrentPageIndex = 0
‘呼叫預約情形表副程式二
Call BindList2()
End Sub
‘登入按鈕的副程式
Sub Login(ByVal sender As Object, ByVal e As EventArgs)
‘建立與資料庫的連結
Dim objCnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("./DB/nssh-order.mdb"))
‘開啟資料庫
objCnn.Open()
‘宣告SQL字串變數
Dim strSQL As String
‘當選擇為管理者時
If rbnLevel1.Checked = True Then
‘設定管理者資料表的SQL命令
strSQL = "Select [A-ID],[A-LN],[A-PW] From [Admin] Where [A-LN] Like '" & txtLN.Text & "'"
End If
‘當選擇為教師時
If rbnLevel2.Checked = True Then
‘設定為教師資料表的SQL命令
strSQL = "Select [T-ID],[T-LN],[T-PW] From [Teacher] Where [T-LN] Like '" & txtLN.Text & "'"
End If
‘宣告並建立命令物件
Dim objCmd As New OleDbCommand()
‘設定命令物件資料來源
objCmd.Connection = objCnn
‘設定命令物件SQL命令文字
objCmd.CommandText = strSQL
‘宣告並傳回命令結果
Dim objReader As OleDbDataReader = objCmd.ExecuteReader()
‘當有資料的時候
If objReader.Read() = True Then
‘做資料的比對
If objReader.Item(2) = txtPW.Text Then
‘當為管理者的時候
If rbnLevel1.Checked = True Then
‘設定等級為管理者
Session("LV") = "Admin"
‘將網頁導向至管理者頁面並傳入管理者識別碼
Response.Redirect("./Admin-Frame.asp?ID=" & objReader.Item(0))
End If
‘當為教師的時候
If rbnLevel2.Checked = True Then
‘設定等級為教師
Session("LV") = "Teacher"
‘將網頁導向至教師頁面並傳入教師識別碼
Response.Redirect("./Teacher-Frame.asp?ID=" & objReader.Item(0))
End If
End If
End If
‘關閉資料庫來源
objCnn.Close()
End Sub
‘宣告重新顯示日期及節日副程式
Sub myCalendar_DayRender(ByVal sender As Object, ByVal e As DayRenderEventArgs)
‘宣告控制項中的日期
Dim d As CalendarDay
‘宣告表格欄
Dim c As TableCell
‘設定重新顯示傳回的日期
d = e.Day
‘設定重新顯示傳回的表格
c = e.Cell
‘判斷日期是否不在顯示的月份之中
If d.IsOtherMonth Then
‘清除欄
c.Controls.Clear()
‘日期在顯示的月份之中
Else
‘例外處理
Try
‘宣告並利用陣列取得節日名稱
Dim Hol As String = holidays(d.Date.Month, d.Date.Day)
‘若有節日存在的話
If Hol <> "" Then
‘將節日名稱加入欄
c.Controls.Add(New LiteralControl("<br>" + Hol))
End If
‘例外處理
Catch exc As Exception
‘顯示錯誤訊息
Response.Write(exc.ToString())
End Try
End If
End Sub
</script>
3.6.1 教師介面¶
Step 1:教師介面由Teacher-Frame.asp開始,這裡我們使用框架將網頁分為兩個區域,左邊為控制區,右邊為填表區。請參考以下程式碼。
<frameset cols="120,*" border=0 frameSpacing=0 frameBorder=0>
‘傳入教師識別碼
<frame name="contents" src="Teacher.aspx?ID=<%=Request.QueryString("ID")%>">
<frame name="main" src="">
Step 2:安排教師工具列如圖3-5,請參考以下程式碼。將程式碼插入Teacher.aspx中的<head>…</head>。
圖 3‑5
<script language="VB" runat="Server">
‘教師工具列頁面載入初始事件副程式
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
‘當判斷等級不是教師時
If Session("LV") <> "Teacher" Then
‘將頁面導向至首頁
Page.Response.Redirect("./Main.aspx")
‘離開副程式
Exit Sub
End If
End Sub
‘預約攝影暗房超連結點選事件副程式
Sub hypTeacher1(ByVal sender As Object, ByVal e As EventArgs)
‘超連結至預約攝影暗房並傳入教師識別碼
HyperLink1.NavigateUrl = "Teacher-Order.aspx?ID=" & Request.QueryString("ID")
End Sub
‘預約記錄表超連結點選事件副程式
Sub hypTeacher2(ByVal sender As Object, ByVal e As EventArgs)
‘超連結至預約記錄表並傳入教師識別碼
HyperLink2.NavigateUrl = "Teacher-History.aspx?ID=" & Request.QueryString("ID")
End Sub
</script>
‘為了讓超連結能夠顯示在填表區,請務必加入下一行HTML指令
<base target="main">
Step 3:安排教師預約攝影暗房申請單如圖9,請參考以下程式碼。將程式碼插入Teacher-Order.aspx中的<head>…</head>。
圖 3‑6
<script language="VB" runat="Server">
‘宣告節日字串陣列
Dim holidays(12, 31) As String
‘教師預約攝影暗房申請單起始載入事件副程式
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
‘判斷等級是否為教師,若不是教師時
If Session("LV") <> "Teacher" Then
‘將網頁導向至首頁
Page.Response.Redirect("./Main.aspx")
‘跳離副程式
Exit Sub
End If
‘載入節日字串到節日陣列
Load_Holidays()
‘避免重複載入BindList_PS()
If Not IsPostBack Then BindList_PS()
End Sub
‘載入節日字串至節日陣列副程式
Sub Load_Holidays()
‘節日陣列元素一為月份,元素二為日期
holidays(1, 1) = "*元旦"
holidays(1, 11) = "司法節"
holidays(1, 15) = "藥師節"
holidays(1, 23) = "自由日"
holidays(2, 4) = "農民節"
holidays(2, 14) = "情人節"
holidays(2, 15) = "戲劇節"
holidays(2, 28) = "*和平紀念日"
holidays(3, 1) = "兵役節"
holidays(3, 5) = "童子軍節"
holidays(3, 8) = "婦女節"
holidays(3, 12) = "植樹節"
holidays(3, 17) = "國醫節"
holidays(3, 20) = "郵政節"
holidays(3, 21) = "氣象節"
holidays(3, 25) = "美術節"
holidays(3, 26) = "廣播節"
holidays(3, 29) = "青年節"
holidays(3, 30) = "出版節"
holidays(4, 1) = "愚人節主計節"
holidays(4, 4) = "婦幼節"
holidays(4, 5) = "音樂節"
holidays(4, 7) = "衛生節"
holidays(4, 22) = "世界地球日"
holidays(5, 1) = "*勞動節"
holidays(5, 4) = "文藝節"
holidays(5, 5) = "舞蹈節"
holidays(5, 10) = "珠算節"
holidays(5, 12) = "護士節"
holidays(6, 3) = "禁煙節"
holidays(6, 6) = "工程師節水利節"
holidays(6, 9) = "鐵路節"
holidays(6, 15) = "警察節"
holidays(6, 30) = "會計師節"
holidays(7, 1) = "漁民節公路節稅務節"
holidays(7, 6) = "合作節"
holidays(7, 11) = "航海節"
holidays(7, 12) = "聾啞節"
holidays(8, 8) = "父親節"
holidays(8, 14) = "空軍節"
holidays(9, 1) = "記者節"
holidays(9, 3) = "軍人節"
holidays(9, 9) = "體育節律師節"
holidays(9, 13) = "法律日"
holidays(9, 28) = "教師節"
holidays(10, 6) = "老人節"
holidays(10, 10) = "*國慶紀念日"
holidays(10, 21) = "華僑節"
holidays(10, 25) = "台灣光復節"
holidays(10, 31) = "萬聖節"
holidays(11, 1) = "商人節"
holidays(11, 11) = "工業節地政節"
holidays(11, 17) = "自來水節"
holidays(11, 12) = "醫師節中華文化復興節"
holidays(11, 21) = "防空節"
holidays(12, 5) = "海員節盲人節"
holidays(12, 10) = "人權節"
holidays(12, 12) = "憲兵節"
holidays(12, 25) = "行憲紀念日聖誕節"
holidays(12, 27) = "建築師節"
holidays(12, 28) = "電信節"
holidays(12, 31) = "受信節"
End Sub
‘初始載入資料副程式
Sub BindList_PS()
‘將日期選擇設定為系統日期
myCalendar.SelectedDate = DateString()
‘清除訊息文字
labMessage.Text = ""
‘當判斷識別碼為空白時
If Request.QueryString("ID") = "" Then
‘跳離副程式
Exit Sub
End If
‘宣告SQL字串變數
Dim strSQL As String
‘宣告並建立資料庫連結
Dim objCnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("./DB/nssh-order.mdb"))
‘開啟資料庫
objCnn.Open()
‘設定SQL命令字串,由教師資料表中找尋教師資訊
strSQL = "Select [T-ID],[T-Name_FN_CHT] From [Teacher] Where [T-ID] Like '" & Request.QueryString("ID") & "'"
‘宣告並建立查詢命令物件
Dim objCmd As New OleDbCommand(strSQL, objCnn)
‘執行SQL命定讀取教師資訊
Dim objReader As OleDbDataReader = objCmd.ExecuteReader()
‘倘若有資料
If objReader.Read() = True Then
‘顯示教師姓名
labT_Name.Text = "教師姓名: " & objReader.Item(1)
End If
‘關閉讀取物件
objReader.Close()
‘關閉資料庫連結
objCnn.Close()
‘設定SQL命令字串,尋找地點資訊
strSQL = "Select [P-ID],[P-Adds] From [PhotoStudio] "
‘將地點資料來源建立起來
rblPS.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "PhotoStudio")
‘設定地點欄位
rblPS.DataTextField = "P-Adds"
‘設定地點識別碼
rblPS.DataValueField = "P-ID"
‘將地點資料來源綁定
rblPS.DataBind()
‘選擇第一個地點
rblPS.SelectedIndex = 0
‘設定SQL命令字串,尋找科目資訊
strSQL = "Select [B-ID],[B-Name] From [Book] "
‘將科目資訊來源建立起來
rblBook.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "Book")
‘設定科目名稱欄位
rblBook.DataTextField = "B-Name"
‘設定科目識別碼
rblBook.DataValueField = "B-ID"
‘將科目資料來源綁定
rblBook.DataBind()
‘選擇第一個科目
rblBook.SelectedIndex = 0
‘設命SQL命令文字,尋找使用班級資訊
strSQL = "Select [C-ID],[C-Name] From [Class] "
‘將資料庫班級資訊來源建立起來
rblClass.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "Class")
‘設定使用班級名稱
rblClass.DataTextField = "C-Name"
‘設定使用班級識別碼
rblClass.DataValueField = "C-ID"
‘將使用班級資料來源綁定
rblClass.DataBind()
‘選擇第一個班級
rblClass.SelectedIndex = 0
‘設定連結資料庫命令字串
objCnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("./DB/nssh-order.mdb")
‘開啟資料庫
objCnn.Open()
‘設定SQL命令文字,尋找是否有預約的訊息
strSQL = "Select [OrderMenu].[O-Date],[OrderMenu].[O-P_ID],[OrderMenu].[O-Time],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class],[PhotoStudio] " & _
"Where [OrderMenu].[O-Date] Like #" & DateString() & "# AND [OrderMenu].[O-P_ID] = " & CLng(rblPS.SelectedItem.Value) & " AND ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] AND [OrderMenu].[O-B_ID] = [Book].[B-ID] AND [OrderMenu].[O-C_ID] = [Class].[C-ID] AND [OrderMenu].[O-P_ID] = [PhotoStudio].[P-ID] )"
‘設定命令物件的資料來源連結
objCmd.Connection = objCnn
‘設定命令物件的命令文字
objCmd.CommandText = strSQL
‘執行SQL命令並讀取結果
objReader = objCmd.ExecuteReader()
‘循序的讀取預約訊息
While objReader.Read()
‘當所對應的節數相同時,則顯示預約訊息,總共有八節,所以判斷有八個,
‘並且將選項鈕禁用,由介面禁止錯誤資料進入
Select Case objReader.Item("O-Time")
Case 1
rbnTime1.Text = "第一節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime1.Enabled = False
Case 2
rbnTime2.Text = "第二節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime2.Enabled = False
Case 3
rbnTime3.Text = "第三節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime3.Enabled = False
Case 4
rbnTime4.Text = "第四節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime4.Enabled = False
Case 5
rbnTime5.Text = "第五節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime5.Enabled = False
Case 6
rbnTime6.Text = "第六節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime6.Enabled = False
Case 7
rbnTime7.Text = "第七節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime7.Enabled = False
Case 8
rbnTime8.Text = "第八節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime8.Enabled = False
End Select
End While
‘關閉讀取物件
objReader.Close()
‘關閉資料來源物件
objCnn.Close()
End Sub
‘預約申請單顯示情形副程式二
Sub BindList2()
‘清除訊息文字
labMessage.Text = ""
‘設定節數名稱初始值
rbnTime1.Text = "第一節:"
rbnTime2.Text = "第二節:"
rbnTime3.Text = "第三節:"
rbnTime4.Text = "第四節:"
rbnTime5.Text = "第五節:"
rbnTime6.Text = "第六節:"
rbnTime7.Text = "第七節:"
rbnTime8.Text = "第八節:"
‘預設節數選擇為空(未點選)
rbnTime1.Checked = False
rbnTime2.Checked = False
rbnTime3.Checked = False
rbnTime4.Checked = False
rbnTime5.Checked = False
rbnTime6.Checked = False
rbnTime7.Checked = False
rbnTime8.Checked = False
‘預設節數選項鈕可使用
rbnTime1.Enabled = True
rbnTime2.Enabled = True
rbnTime3.Enabled = True
rbnTime4.Enabled = True
rbnTime5.Enabled = True
rbnTime6.Enabled = True
rbnTime7.Enabled = True
rbnTime8.Enabled = True
‘宣告SQL命令字串變數
Dim strSQL As String
‘宣告並建立資料連結物件
Dim objCnn As New OleDbConnection
‘宣告並建立資料查詢命令物件
Dim objCmd As New OleDbCommand()
‘宣告讀取物件
Dim objReader As OleDbDataReader
‘設定資料庫來源連結字串
objCnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("./DB/nssh-order.mdb")
‘開啟資料庫
objCnn.Open()
‘假如沒有選擇日期則
If myCalendar.SelectedDate = Nothing Then
‘設定系統日期為選擇日期
myCalendar.SelectedDate = DateString()
End If
‘設定SQL命令文字字串,查詢預約情形
strSQL = "Select [OrderMenu].[O-Date],[OrderMenu].[O-P_ID],[OrderMenu].[O-Time],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class],[PhotoStudio] " & _
"Where [OrderMenu].[O-Date] Like #" & DateValue(myCalendar.SelectedDate) & "# AND [OrderMenu].[O-P_ID] = " & CLng(rblPS.SelectedItem.Value) & " AND ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] AND [OrderMenu].[O-B_ID] = [Book].[B-ID] AND [OrderMenu].[O-C_ID] = [Class].[C-ID] AND [OrderMenu].[O-P_ID] = [PhotoStudio].[P-ID] )"
‘設定命令物件連結資料來源
objCmd.Connection = objCnn
‘設定命令物件SQL文字
objCmd.CommandText = strSQL
‘執行SQL查詢並傳回結果
objReader = objCmd.ExecuteReader()
‘循序讀取傳回結果
While objReader.Read()
‘當所對應的節數相同時,則顯示預約訊息,總共有八節,所以判斷有八個,
‘並且將選項鈕禁用,由介面禁止錯誤資料進入
Select Case objReader.Item("O-Time")
Case 1
rbnTime1.Text = "第一節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime1.Enabled = False
Case 2
rbnTime2.Text = "第二節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime2.Enabled = False
Case 3
rbnTime3.Text = "第三節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime3.Enabled = False
Case 4
rbnTime4.Text = "第四節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime4.Enabled = False
Case 5
rbnTime5.Text = "第五節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime5.Enabled = False
Case 6
rbnTime6.Text = "第六節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime6.Enabled = False
Case 7
rbnTime7.Text = "第七節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime7.Enabled = False
Case 8
rbnTime8.Text = "第八節:" & objReader.Item("T-Name_FN_CHT") & Chr(32) & objReader.Item("B-Name") & Chr(32) & Chr(32) & objReader.Item("C-Name")
rbnTime8.Enabled = False
End Select
End While
‘關閉讀取物件
objReader.Close()
‘關閉資料來源
objCnn.Close()
End Sub
‘當日曆選擇日期改變時
Sub DayChange(ByVal sender As Object, ByVal e As EventArgs)
‘呼叫預約情形顯示副程式二
Call BindList2()
End Sub
‘當地點選擇有改變時
Sub PSChange(ByVal sender As Object, ByVal e As EventArgs)
‘呼叫預約情形顯示副程式二
Call BindList2()
End Sub
‘當預約確定後
Sub OrderClass(ByVal sender As Object, ByVal e As EventArgs)
‘判斷選擇的是否為日期格式,若不是則
If IsDate(myCalendar.SelectedDate) = False Then
‘顯示提示訊息
labMessage.Text = "請先選擇日期。"
‘跳離副程式
Exit Sub
End If
‘當選擇的日期小於系統日期,也就是選擇到今天之前的日期
If myCalendar.SelectedDate < DateString() Then
‘顯示提示訊息
labMessage.Text = "預約日期錯誤。"
‘跳離副程式
Exit Sub
End If
‘設定節次初始值
Dim strO_Time As String = "0"
‘依照選項設定節次的設定值
If rbnTime1.Checked = True Then strO_Time = "1"
If rbnTime2.Checked = True Then strO_Time = "2"
If rbnTime3.Checked = True Then strO_Time = "3"
If rbnTime4.Checked = True Then strO_Time = "4"
If rbnTime5.Checked = True Then strO_Time = "5"
If rbnTime6.Checked = True Then strO_Time = "6"
If rbnTime7.Checked = True Then strO_Time = "7"
If rbnTime8.Checked = True Then strO_Time = "8"
‘倘若沒有選擇節次
If strO_Time = "0" Then
‘顯示提示訊息
labMessage.Text = "請先選擇節次。"
‘跳離副程式
Exit Sub
End If
‘宣告並建立資料庫連結物件
Dim objConn As New OleDbConnection()
‘設定資料庫連結物件的命令文字
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("./DB/nssh-order.mdb")
‘開啟資料庫
objConn.Open()
‘建立SQL命令查詢物件,搜尋是否已經有預約
Dim objCmd As New OleDbCommand("Select [O-Date],[O-P_ID],[O-Time] From [OrderMenu] " & _
"Where [O-Date] Like #" & DateValue(myCalendar.SelectedDate) & "# And [O-P_ID] = " & (rblPS.SelectedItem.Value) & " And [O-Time] Like '" & strO_Time & "'", _
objConn)
‘宣告並讀取傳回結果
Dim objReader As OleDbDataReader = objCmd.ExecuteReader()
‘倘若有資料代表已經被預約了
If objReader.Read() = True Then
‘顯示提示訊息
labMessage.Text = "已經被預約了。"
‘關閉資料庫連結
objConn.Close()
‘跳離副程式
Exit Sub
End If
‘關閉讀取物件
objReader.Close()
‘釋放命令物件
objCmd.Dispose()
'建立命令物件,並執行SQL新增的指令
‘命令物件連結資料庫來源
objCmd.Connection = objConn
‘設定命令文字,準備新增預約資料
objCmd.CommandText = "Insert Into OrderMenu ([O-Date], [O-P_ID], [O-Time], [O-T_ID], [O-B_ID], [O-C_ID]) " & _
"Values ('" & DateValue(myCalendar.SelectedDate) & "','" & (rblPS.SelectedItem.Value) & "','" & strO_Time & "','" & Request.QueryString("ID") & "','" & (rblBook.SelectedItem.Value) & "','" & (rblClass.SelectedItem.Value) & "')"
‘執行命令
objCmd.ExecuteNonQuery()
‘關閉資料庫連接
objConn.Close()
‘呼叫BindList2(),重新顯示畫面
Call BindList2()
‘顯示預約成功的訊息
labMessage.Text = "預約成功!"
End Sub
‘宣告重新顯示日期及節日副程式
Sub myCalendar_DayRender(ByVal sender As Object, ByVal e As DayRenderEventArgs)
‘宣告控制項中的日期
Dim d As CalendarDay
‘宣告表格欄
Dim c As TableCell
‘設定重新顯示傳回的日期
d = e.Day
‘設定重新顯示傳回的表格
c = e.Cell
‘判斷日期是否不在顯示的月份之中
If d.IsOtherMonth Then
‘清除欄
c.Controls.Clear()
‘日期在顯示的月份之中
Else
‘例外處理
Try
‘宣告並利用陣列取得節日名稱
Dim Hol As String = holidays(d.Date.Month, d.Date.Day)
‘若有節日存在的話
If Hol <> "" Then
‘將節日名稱加入欄
c.Controls.Add(New LiteralControl("<br>" + Hol))
End If
‘例外處理
Catch exc As Exception
‘顯示錯誤訊息
Response.Write(exc.ToString())
End Try
End If
End Sub
</script>
Step 4:安排教師攝影暗房預約紀錄表如圖3-7,請參考以下程式碼。將程式碼插入Teacher-History.aspx中的<head>…</head>。
圖 3‑7
<script language="VB" runat="Server">
‘宣告節日字串陣列
Dim holidays(12, 31) As String
‘宣告教師識別碼暫存變數
Dim strT_ID As String
‘宣告載入節日文字副程式,但與之前的內容相同,因此省略一些程式碼
Sub Load_Holidays()
holidays(1, 1) = "*元旦中華民國開國紀念日"
holidays(1, 11) = "司法節"
‘………
‘內容與之前相同,因此省略一些程式碼,請參考之前程式碼
‘………
holidays(12, 27) = "建築師節"
holidays(12, 28) = "電信節"
holidays(12, 31) = "受信節"
End Sub
‘頁面載入初始事件副程式
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
‘判斷等級是否不為教師
If Session("LV") <> "Teacher" Then
‘若不是則將網頁導向首頁
Page.Response.Redirect("./Main.aspx")
‘跳離副程式
Exit Sub
End If
‘設定教師識別碼
strT_ID = Request.QueryString("ID")
‘載入節日字串
Load_Holidays()
‘避免重複載入BindList_PS()
If Not IsPostBack Then BindList_PS()
‘避免重複載入BindList()
If Not IsPostBack Then BindList()
End Sub
‘宣告初始資料連結顯示副程式
Sub BindList_PS()
‘設定日期選擇為系統日期
myCalendar.SelectedDate = DateString()
‘倘若識別碼為空則
If Request.QueryString("ID") = "" Then
‘跳離副程式
Exit Sub
End If
‘宣告SQL字串變數
Dim strSQL As String
‘宣告並建立資料來源物件
Dim objCnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("./DB/nssh-order.mdb"))
‘開啟資料庫
objCnn.Open()
‘設定SQL命令字串,尋找教師資訊
strSQL = "Select [T-ID],[T-Name_FN_CHT] From [Teacher] Where [T-ID] Like '" & Request.QueryString("ID") & "'"
‘宣告並建立命令物件
Dim objCmd As New OleDbCommand(strSQL, objCnn)
‘宣告讀取物件並傳回結果
Dim objReader As OleDbDataReader = objCmd.ExecuteReader()
‘當有資料時
If objReader.Read() = True Then
‘顯示教師姓名
labT_Name.Text = "教師姓名: " & objReader.Item(1)
End If
‘關閉讀取物件
objReader.Close()
‘關閉資料庫來源
objCnn.Close()
‘設定SQL命令文字,尋找所有地點資訊
strSQL = "Select [P-ID],[P-Adds] From [PhotoStudio] "
‘設定並建立資料來源給選項鈕
myRadioButtonList.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "PhotoStudio")
‘設定欄位文字
myRadioButtonList.DataTextField = "P-Adds"
‘設定欄位值
myRadioButtonList.DataValueField = "P-ID"
‘將來源資料綁定
myRadioButtonList.DataBind()
‘預設選擇第一個
myRadioButtonList.SelectedIndex = 0
End Sub
‘顯示預約情形副程式,單純只選擇一日
Sub BindList()
‘宣告SQL命令字串變數
Dim strSQL As String
‘設定SQL命令文字
strSQL = "Select [OrderMenu].[O-T_ID],[OrderMenu].[O-B_ID],[OrderMenu].[O-C_ID],[OrderMenu].[O-P_ID],[OrderMenu].[O-Date],[OrderMenu].[O-Time],[Teacher].[T-Name_LN_CHT],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class] " & _
"Where [OrderMenu].[O-Date] Like #" & DateString() & "# And [O-T_ID] =" & CLng(strT_ID) & " And [OrderMenu].[O-P_ID] = " & CLng(myRadioButtonList.SelectedItem.Value) & " And ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] And [OrderMenu].[O-B_ID] = [Book].[B-ID] And [OrderMenu].[O-C_ID] = [Class].[C-ID]) Order By [OrderMenu].[O-Date],[OrderMenu].[O-Time]"
‘設定現在頁面數為零
myDataGrid.CurrentPageIndex = 0
‘建立與資料庫的連結
myDataGrid.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "OrderMenu")
‘讓資料表格與資料來源綁定
myDataGrid.DataBind()
End Sub
‘顯示預約情形副程式,可選擇多日
Sub BindList2()
‘宣告SQL字串變數
Dim strSQL As String
‘當選擇日期只有一日時
If myCalendar.SelectedDates.Count = 1 Then
‘設定SQL查詢命令文字
strSQL = "Select [OrderMenu].[O-T_ID],[OrderMenu].[O-B_ID],[OrderMenu].[O-C_ID],[OrderMenu].[O-P_ID],[OrderMenu].[O-Date],[OrderMenu].[O-Time],[Teacher].[T-Name_LN_CHT],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class] " & _
"Where [OrderMenu].[O-Date] Like #" & DateValue(myCalendar.SelectedDate) & "#" & " And [O-P_ID] = " & CLng(myRadioButtonList.SelectedItem.Value) & " And [O-T_ID] =" & CLng(strT_ID) & " And ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] And [OrderMenu].[O-B_ID] = [Book].[B-ID] And [OrderMenu].[O-C_ID] = [Class].[C-ID]) Order By [OrderMenu].[O-Date],[OrderMenu].[O-Time]"
‘資料表選擇現在頁面索引為零
myDataGrid.CurrentPageIndex = 0
‘當選擇的日期大於一日時,選擇一週或是一月
ElseIf myCalendar.SelectedDates.Count > 1 Then
‘宣告起始日字串變數
Dim strFirstDate As String
‘宣告結束日字串變數
Dim strLastDate As String
‘設定起始日與結束日的範圍值
With myCalendar.SelectedDates
strFirstDate = .Item(0)
strLastDate = .Item(.Count - 1)
End With
‘設定SQL命令文字
strSQL = "Select [OrderMenu].[O-T_ID],[OrderMenu].[O-B_ID],[OrderMenu].[O-C_ID],[OrderMenu].[O-P_ID],[OrderMenu].[O-Date],[OrderMenu].[O-Time],[Teacher].[T-Name_LN_CHT],[Teacher].[T-Name_FN_CHT],[Book].[B-Name],[Class].[C-Name] From [OrderMenu],[Teacher],[Book],[Class] " & _
"Where [OrderMenu].[O-Date] Between #" & strFirstDate & "# And #" & strLastDate & "# And [O-P_ID] = " & CLng(myRadioButtonList.SelectedItem.Value) & " And [O-T_ID] =" & CLng(strT_ID) & " And ( [OrderMenu].[O-T_ID] = [Teacher].[T-ID] And [OrderMenu].[O-B_ID] = [Book].[B-ID] And [OrderMenu].[O-C_ID] = [Class].[C-ID]) Order By [OrderMenu].[O-Date],[OrderMenu].[O-Time]"
End If
‘設定資料表來源連結並建立資料庫連結
myDataGrid.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "OrderMenu")
‘將資料表與來源綁定
myDataGrid.DataBind()
End Sub
‘宣告資料表有換頁事件副程式
Sub myDataGrid_PageIndexChanged(ByVal sender As Object, ByVal e As DataGridPageChangedEventArgs)
‘設定新頁數給現在頁面的索引
myDataGrid.CurrentPageIndex = e.NewPageIndex
‘呼叫重新顯示資料的副程式
Call BindList2()
End Sub
‘宣告當日期有變動時的副程式
Sub DayChange(ByVal sender As Object, ByVal e As EventArgs)
‘設定現在頁面回到第一頁
myDataGrid.CurrentPageIndex = 0
‘呼叫重新顯示資料的副程式
Call BindList2()
End Sub
‘宣告地點選擇變動副程式
Sub PhotoStudioChange(ByVal sender As Object, ByVal e As EventArgs)
‘設定現在頁面回到第一頁
myDataGrid.CurrentPageIndex = 0
‘呼叫重新顯示資料的副程式
Call BindList2()
End Sub
‘宣告重新顯示日期及節日副程式
Sub myCalendar_DayRender(ByVal sender As Object, ByVal e As DayRenderEventArgs)
‘宣告控制項中的日期
Dim d As CalendarDay
‘宣告表格欄
Dim c As TableCell
‘設定重新顯示傳回的日期
d = e.Day
‘設定重新顯示傳回的表格
c = e.Cell
‘判斷日期是否不在顯示的月份之中
If d.IsOtherMonth Then
‘清除欄
c.Controls.Clear()
‘日期在顯示的月份之中
Else
‘例外處理
Try
‘宣告並利用陣列取得節日名稱
Dim Hol As String = holidays(d.Date.Month, d.Date.Day)
‘若有節日存在的話
If Hol <> "" Then
‘將節日名稱加入欄
c.Controls.Add(New LiteralControl("<br>" + Hol))
End If
‘例外處理
Catch exc As Exception
‘顯示錯誤訊息
Response.Write(exc.ToString())
End Try
End If
End Sub
</script>
3.6.2 管理介面¶
Step 1:教師介面由Admin-Frame.asp開始,這裡我們使用框架將網頁分為兩個區域,左邊為控制區,右邊為填表區。請參考以下程式碼。
<frameset cols="120,*" border=0 frameSpacing=0 frameBorder=0>
‘傳入管理者識別碼
<frame name="contents" src="Admin.aspx?ID=<%=Request.QueryString("ID")%>">
<frame name="main" src="">
Step 2:安排管理者工具列如圖3-8,請參考以下程式碼。將程式碼插入Admin.aspx中的<head>…</head>。
圖 3‑8
<script language="VB" runat="Server">
‘頁面初始載入事件副程式
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
‘倘若等級不為管理者
If Session("LV") <> "Admin" Then
‘將頁面導向至首頁
Page.Response.Redirect("./Main.aspx")
‘跳離副程式
Exit Sub
End If
End Sub
‘點選「攝影暗房」超連結事件副程式
Sub hypAdmin1(ByVal sender As Object, ByVal e As EventArgs)
‘將頁面導向攝影暗房管理網頁,並傳入管理者識別碼
HyperLink1.NavigateUrl = "Admin-PhotoStudio.aspx?ID=" & Request.QueryString("ID")
End Sub
‘點選「科目」超連結事件副程式
Sub hypAdmin2(ByVal sender As Object, ByVal e As EventArgs)
‘將頁面導向科目管理網頁,並傳入管理者識別碼
HyperLink2.NavigateUrl = "Admin-Book.aspx?ID=" & Request.QueryString("ID")
End Sub
‘點選「班級」超連結事件副程式
Sub hypAdmin3(ByVal sender As Object, ByVal e As EventArgs)
‘將頁面導向科目管理網頁,並傳入管理者識別碼
HyperLink3.NavigateUrl = "Admin-Class.aspx?ID=" & Request.QueryString("ID")
End Sub
‘點選「教師」超連結事件副程式
Sub hypAdmin4(ByVal sender As Object, ByVal e As EventArgs)
‘將頁面導向教師管理網頁,並傳入管理者識別碼
HyperLink4.NavigateUrl = "Admin-Teacher.aspx?ID=" & Request.QueryString("ID")
End Sub
‘點選「預約情形」超連結事件副程式
Sub hypAdmin6(ByVal sender As Object, ByVal e As EventArgs)
‘將頁面導向預約情形網頁,並傳入管理者識別碼
HyperLink6.NavigateUrl = "Admin-OrderList.aspx?ID=" & Request.QueryString("ID")
End Sub
</script>
‘為求導向的頁面能在管理區顯示,務必加入此行
<base target="main">
Step 3:安排攝影暗房如圖3-9,請參考以下程式碼。將程式碼插入Admin-PhotoStudio.aspx中的<head>…</head>。
圖 3‑9
<script language="VB" runat="Server">
‘顯示攝影暗房資料的副程式
Sub BindList()
‘設定SQL命令文字
Dim strSQL As String = "Select * From [PhotoStudio]"
‘設定資料表的來源,並建立資料來源
myDataList.DataSource = CreateDataSet(strSQL, "./DB/nssh-order.mdb", "[PhotoStudio]")
‘資料表將來源綁定
myDataList.DataBind()
End Sub
‘頁面初始載入副程式
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
‘判斷是否不為管理者
If Session("LV") <> "Admin" Then
‘不是管理者則導向首頁
Page.Response.Redirect("./Main.aspx")
‘跳離副程式
Exit Sub
End If
‘避免重複載入BindList()
If Not IsPostBack Then BindList()
End Sub
‘資料表編輯事件副程式
Sub DataList_EditCommand(ByVal sender As Object, ByVal e As DataListCommandEventArgs)
‘將現項目索引設定給編輯索引
myDataList.EditItemIndex = e.Item.ItemIndex
‘重新顯示資料表
BindList()
End Sub
‘資料表取消事件副程式
Sub DataList_CancelCommand(ByVal sender As Object, ByVal e As DataListCommandEventArgs)
‘設定取消編輯索引
myDataList.EditItemIndex = -1
‘重新顯示資料表
BindList()
End Sub
‘宣告執行查詢SQL命令的副程式
Sub ExecuteSQL(ByVal strSQL As String)
‘宣告並建立資料庫連結物件
Dim objConn As New OleDbConnection()
‘設定資料庫連結命令文字
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("./DB/nssh-order.mdb")
‘開啟資料庫
objConn.Open()
‘宣告並建立命令物件
Dim objCmd As New OleDbCommand(strSQL, objConn)
‘執行SQL命令
objCmd.ExecuteNonQuery()
‘關閉資料庫連結物件
objConn.Close()
End Sub
‘宣告資料表刪除事件副程式
Sub DataList_DeleteCommand(ByVal sender As Object, ByVal e As DataListCommandEventArgs)
‘宣告SQL命令字串,刪除攝影暗房地點資訊
Dim strSQL As String = "Delete From [PhotoStudio] Where [" & _
myDataList.DataKeyField & "]=" & myDataList.DataKeys(e.Item.ItemIndex)
‘執行SQL命令
ExecuteSQL(strSQL)
‘取消資料表編輯項目
myDataList.EditItemIndex = -1
‘重新顯示資料表
BindList()
End Sub
‘資料表編輯更新副程式
Sub DataList_UpdateCommand(ByVal sender As Object, ByVal e As DataListCommandEventArgs)
‘獲得新的編輯文字
Dim strPAdds As String = CType(e.Item.FindControl("txtPAdds"), TextBox).Text
‘獲得新的更新日期
Dim UpdateDate As DateTime = DateTime.Now.Date()
‘設定SQL命令文字
Dim strSQL As String = "Update [PhotoStudio] Set [P-Adds]='" & strPAdds & "' " & _
"Where [" & myDataList.DataKeyField & "]=" & myDataList.DataKeys(e.Item.ItemIndex)
‘執行SQL命令
ExecuteSQL(strSQL)
‘設定取消編輯索引
myDataList.EditItemIndex = -1
‘重新顯示資料
BindList()
End Sub
‘宣告新增資料事件副程式
Sub PAdds_Insert(ByVal sender As Object, ByVal e As EventArgs)
‘倘若新增資料文字為空,則跳離副程式
If txtPAdds_Insert.Text = "" Then Exit Sub
‘宣告SQL命令文字,新增資料
Dim strSQL As String = "Insert Into [PhotoStudio] ([P-Adds]) Values ('" & txtPAdds_Insert.Text & "')"
‘執行SQL命令
ExecuteSQL(strSQL)
‘清除新增文字
txtPAdds_Insert.Text = ""
‘重新顯示資料
BindList()
End Sub
</script>
Step 4:安排科目、班級、教師如圖3-10~12,程式碼與攝影暗房的程式碼幾乎相同,只要依照不同主題的欄位修改即可。將程式碼插入科目、班級、教師中的<head>…</head>。
圖 3‑10
圖 3‑11
圖 3‑12
Step 4:安排預約記錄表如圖3-13,程式碼是首頁與攝影暗房程式碼的合體,只要依照不同主題的欄位修改即可。將程式碼插入Admin-OrderList.aspx中的<head>…</head>。
圖 3‑13
3.7 修改重點¶
細心的讀者可能會發現,在顯示節日的部分為何不用共用函式來撰寫,反倒要在每一張有使用日曆的網頁都重寫一遍,其實如果管理者與教師的所需的節日是相同的,那當然採用共用函式的做法,但實際應用上因為管理者與教師所需節日描述有所不同,因此才分開撰寫,節日描述只是幫助獲得資訊,並沒有太大作用。
一般來說場地租借的功能這裡都具備基礎,實際應用時只需要修改名稱即可,例如在公司會議室上的預約應用,只要將地點改為會議室,科目改為會議主題,教師改為與會人員,使用班級改為使用部門,很簡單的就可以掛在網路上了。
倘若公司已經有人員資料庫,那麼將資料來源連結到公司現有的人員資料庫,您也就省下新增人員的動作了。
3.8 結論¶
設計這類程式的時候,儘量先規劃出共同的介面,這樣無論對於使用者及設計者都有相當的好處,因為程式碼可重複使用,事實上我們設計這個程式的時候,管理介面基本上都是相同的,直接用複製然後修改欄位及名稱,這樣就完成一個的新功能,根本不需要針對每一個功能重新設計,特別是日曆功能,程式碼根本是一模一樣。因此共同介面的規劃是相當重要而且節省時間的方法。
此外,由於採用ASP.NET的設計方式,日曆物件已經準備好了,只需要透過少許的修改就可以使用。資料表也亦同。善用系統已經提供的物件,可以節省下不少的設計時間。
Lai Tai-Yu (賴岱佑)