2011年10月30日 星期日

ListBox控制項基本使用方式


◎以上程式範例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:資料表欄位與內容的設計
image
image

附註2:有關Visual Studio提供ADO.NET的精靈工具(資料來源組態精靈)…讓你點點點就完成資料繫結
(1) 點選控制項後「選擇資料來源」,使用要建立「新資料來源」image
(2)這裡選擇SQL資料庫,從這裡也可以看到ADO.NET支援的連結類型包羅萬象,底下預設會有一個資料來源ID
image
(3)第一次使用要建立「新資料來源」步驟會較多,這邊就略過與資料庫連結的步驟 ,大柢就是產生一個連接字串(裡頭包含DataSource UserID Password),下回使用連結時,因為產生過一次,所以若使用同一個資料庫就沒有這麼繁瑣
image
(4) 設定完連接後,會以字串的方式存在應用程式組態檔中,也就是在開發網站根目錄下的Web.Config這個XML檔案裡。
image
(5)撰寫SQL指令,這裡也談不上真的寫,精靈提供二種方式
●指定資料表或檢視的資料行:這個是透過畫面來挑選、並下一些常用的where、order參數…簡單…點點點就成了…底下還即時提供你的select陳述式。
●指定自訂SQL陳述式或預存程序:如果是要關聯(join)多個資料表,那麼就要選這個,相對而言這個方式比較多元。
image
6)最後把資料和控制項給繫結起來就可以了,選取要在控件中的資料欄位就是text,而選取控件值的資料欄位對應的就是value
image
和自已手動和資料庫連結比較起來…
也許你會覺得精靈較快
但就我的經驗看來
用精靈的話初始化很快,但是後面的維護很麻煩,得另外跑到設計頁面上去點開來重新修改,倒不如直接在後置程式碼上維護。尤其是當資料表的資料欄位異動的時候,整個精靈原先的設定會跑掉,需要重新建立…
(好吧,一個專業的設計應該不容許在資料庫未設計完成時就動工作web form…但我有時候真的想先看到一些東西…然後才會設計資料表欄位…業餘不足)

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
// Dnow Function