簡介:
         本範例與旅館預約系統十分類似,重點在介紹一個有大量位置資訊的程式其實可以不必替每一個位置增闢一個資料欄位,譬如一個遊覽車班次可能有四十個座位,可以使用字串處理將一個車次當作一筆資料處理,當然本範例為了解說之便,也希望能在一次上課時間內操作完畢,忽略了訂票人的個人資訊處理,只展示日期車次的訂位資訊,真正實用的系統還需要與旅館預約系統類似加上訂票人資訊。

建立資料庫
首先建立一張『車次表』欄位設定如下:

接著輸入幾個車次如下:

上面的是靜態資料,程式執行中都不會變動,接著要設計一個『訂位表』,欄位定義如下:

與旅館預約系統類似,此處日期與車次前面都有代表主索引鍵的鑰匙符號,這是複合鍵,意思是資料的日期可以相同,車次也可以相同,但是日期與車次不能同時都一樣,如果一樣就是車次被重複訂位了!設定方式是用Shift加滑鼠點選,同時選這兩欄之後設定主索引鍵。資料型別皆用預設值nchar(10)即可。為了簡化程式碼,我們的車子只有10個位置,因此訂位資料就是10個字元的字串,當然這些都可以隨時修改,擴充營業的!

網頁介面設計
首先請將本範例需要的所有物件先一次擺出來,最上方是一個Calendar月曆物件,接著是一個RadioButtonList,是用來顯示車次的,請連到車次表,而且只選擇車次欄位就好!
然後是一個表格置入10個CheckBox代表一輛車的10個座位。這裡有個小技巧,可以將第一個置入的CheckBox更名為S0,接著就拷貝此物件一一複製到表格欄位中,你會發現他們會依序被命名為S1~S9。要讓表格各格都有框線,最簡單的方式是設定Table的Border屬性(格線寬)為1,其他樣式表設定的方式都比較麻煩。
接著是一個確定訂位的按鍵,最後還有一個GridView,與前面書籍資料的單元類似,也是用來將資料帶進網頁處理用的。


RadioButtonList是要顯示車次的,請按照之前所學,連接到資料庫的『車次表』的『車次』欄位即可,AutoPostBack需開啟。GridView1的連結設定必須與RadioButtonList1連動,就是在Where的條件式中選定車次要等於RadioButtonList1.SelectedValue,日期擇要等於Session"Date",這個工作階段變數就是使用者需要處理資料的日期。
執行畫面如下:


初始日期
首先在Page_load寫程式如下,意義是首次進入網頁時給定一個日期變數就是今天的日期:


蒐集資料
接著必須先建立將CheckBox勾選的資料變成字串的自訂副程式:


輸入第一筆資料
因為資料庫是全空的,我們先來寫程式輸入第一筆資料,程式碼包括Calendar被點選時與按下Button1的時候:

日期被點選時我們用Session("Date")工作階段變數記住它,SelectedDate事實上包括時分秒像這樣:" 資料庫中有資料之後我們應該要能讀取舊資料,之後還要能更新甚至刪除舊資料。首先需要的是當使用者選到某日某房時要能將該筆資料讀進網頁,這就是前面設計時放置的GridView要做的事情了!請開始替它連結資料庫,資料表及欄位選擇如下,再按WHERE設定條件:
所以用年月日與時分秒之間的一個空白將資料切開,D(0)就是日期了。輸入資料的部分就是借用SqlDataSource的資料連結直接建立InsertCommand新增資料。與上一單元唯一不同之處是使用GetCkb蒐集勾選的訂位資訊,不管幾個座位,我們都可以只用資料表的一個欄位紀錄即可。輸入後去看看訂位表資料應該類似這樣:


讀出資料
當使用者選擇日期與車次後我們希望上面的GridView可以帶出訂位表中的該筆資料,資料連結的設定與前一單元旅館預約系統十分相似,就是日期與Session("Date")相等,車次與RadioButtonList1.SelectedValue相等,程式也一樣寫在GridView1_DataBound,如下,在此我們還需要一個逆向將資料讀出到CheckBox的副程式:


輸入或修改資料
最後要處理的是如果該日該車次已有訂單紀錄,我們的勾選動作(Button1_Click)就必須變成Update(更新)而非Insert(新增)了!一個簡單的方式知道有無舊資料就是看GridView1有無資料,如果有就是更新,沒有就是新增了!