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 (賴岱佑)