◎以上程式範例AspNet05.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論
' ===== 自已寫的:為了方便ADO.NET ===== Imports System Imports System.Web.Configuration Imports System.Data Imports System.Data.SqlClient ' ============ Partial Class AspNet05 Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' ===== ListBox控制項基本使用方式 ===== ' ListBox和DropDownList控制項在整體功能上幾乎一樣, ' 差別在多了一個「複選」的機制,對我而言,它的應用 ' 就像是考試時的複選題,「至少」要選一項而且也沒有例外 ' ===== 如何取得user複選後的結果 ===== ' ListBox複選的功能就是HTML裡的<select muliple>標籤,預設為單選 ' 複選方式和在windows系統下一樣,壓著CTRL鍵後滑鼠左點就可以使用 ListBox1.SelectionMode = ListSelectionMode.Multiple ' 後面放一個Button,按下後就可以檢測出user選擇的結果 Me.Button1.Text = "送出結果" End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click ' 這邊不設listbox1是自動PostBack,因為我們要多選,總不能選一次update一次 ' 先設一個變數來裝子選項的文字串… Dim PickupItems As String = Nothing ' 這段for next迴圈是在一一比對所有子項目是否有被選取,有選取者就條列出來 ' 裡頭用了許多ListBox裡的Item屬性來控制: ' Items.Count:計算並取得控件裡有多少的子選項 ' Items(i).Selected:檢查第(i)個子選項是否有被選取, ' 第一項是item(0),所以迴圈由0開始 ' 也因此…迴圈的最後一個數字我們要items.count-1 For i As Integer = 0 To ListBox1.Items.Count - 1 If ListBox1.Items(i).Selected = True Then ' 這邊不能用 ListBox1.SelectedValue、ListBox1.Selecteditem.text,因為是多選 PickupItems &= ListBox1.Items(i).Value & ListBox1.Items(i).Text & "、" End If Next Response.Write("你選擇的有:" & PickupItems) ' 備註:我們當然也可以在Button按下後先下個判別式判別user有沒有選 ' ,沒選的話其實就不用浪費迴圈的資源 ' If ListBox1.SelectedIndex = True Then ' 進行迴圈 ' End If End Sub Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit ' ===== 關於ListBox的子項目來源 ===== ' 如同DropDownList,子項目可以在CodeBehind段完成, ' 或是直接用Visual Studio操作精靈直接在HTML裡寫死。 ' 但如果是碰到要下拉選擇「地址」的這種案子, ' 每一個Form要把子項目重塞一次未免太折騰,所以子項目來源 ' 也可以設計成用撈資料庫的方式來完成… ' ListBox有一個DataSourceID屬性,這個控制項是用來 ' 搭配ADO.NET進行資料繫結(DataBinding,對岸稱作資料綁定) ' 把資料表中各欄位的資料透過ListBox呈現在HTML上 ' (DropDownList 也有這個屬性) ' 利用Visual Studio的工具可以點點點就繫結完畢… ' 後面我會附註說明怎麼用精靈點點點,這個程式刻意用「寫」的方式 ' 順便也簡略提一下ADO.NET在Visual Studio裡做了什麼事 ' 設定連接字串來連結資料庫,然後開啟 Dim Conn As New SqlConnection("Data Source=***.mssql.somee.com;Persist Security Info=True;User ID=****;Password=****") Conn.Open() ' 撰寫SQL指令,指令為選擇(select)「test_list」這個資料表的所有(*)欄位 ' 有關資料表欄位設計及內容請看附註的圖示() Dim cmd As SqlCommand = New SqlCommand("select * from test_list", Conn) ' 把資料和控制項綁在一定,產生DataReader Dim dr As SqlDataReader = cmd.ExecuteReader() ListBox1.DataSource = dr ' 設定子項目的「Text」和「Value」分別對應資料表中的哪個欄位 ' 一定要設定不然就算DropDownList綁定資料表了內容也無法正常顯示 ListBox1.DataTextField = "次分類" ListBox1.DataValueField = "編號" ' 最後資料繫結…刪除暫存的SQL指令、關閉DataReader通道、關閉和SQL的連接 ListBox1.DataBind() cmd.Cancel() dr.Close() Conn.Close() End Sub End Class
附註1:資料表欄位與內容的設計
附註2:有關Visual Studio提供ADO.NET的精靈工具(資料來源組態精靈)…讓你點點點就完成資料繫結
(1) 點選控制項後「選擇資料來源」,使用要建立「新資料來源」
(2)這裡選擇SQL資料庫,從這裡也可以看到ADO.NET支援的連結類型包羅萬象,底下預設會有一個資料來源ID
(3)第一次使用要建立「新資料來源」步驟會較多,這邊就略過與資料庫連結的步驟 ,大柢就是產生一個連接字串(裡頭包含DataSource UserID Password),下回使用連結時,因為產生過一次,所以若使用同一個資料庫就沒有這麼繁瑣
(4) 設定完連接後,會以字串的方式存在應用程式組態檔中,也就是在開發網站根目錄下的Web.Config這個XML檔案裡。
(5)撰寫SQL指令,這裡也談不上真的寫,精靈提供二種方式
●指定資料表或檢視的資料行:這個是透過畫面來挑選、並下一些常用的where、order參數…簡單…點點點就成了…底下還即時提供你的select陳述式。
●指定自訂SQL陳述式或預存程序:如果是要關聯(join)多個資料表,那麼就要選這個,相對而言這個方式比較多元。
6)最後把資料和控制項給繫結起來就可以了,選取要在控件中的資料欄位就是text,而選取控件值的資料欄位對應的就是value
和自已手動和資料庫連結比較起來…
也許你會覺得精靈較快
但就我的經驗看來
用精靈的話初始化很快,但是後面的維護很麻煩,得另外跑到設計頁面上去點開來重新修改,倒不如直接在後置程式碼上維護。尤其是當資料表的資料欄位異動的時候,整個精靈原先的設定會跑掉,需要重新建立…
(好吧,一個專業的設計應該不容許在資料庫未設計完成時就動工作web form…但我有時候真的想先看到一些東西…然後才會設計資料表欄位…業餘不足)
沒有留言:
張貼留言