連動式dropdownlist

連動式dropdownlist

先撈出所有城鎮value

 Sub GetTown()
        TownID.Items.Clear()
        Conn.Open()
        Dim Comm As New SqlCommand("Select TownID, TownName From ListTown Order By TownID", Conn)
        Dim RD As SqlDataReader = Comm.ExecuteReader()
        While RD.Read()
            Dim li As New ListItem
            li.Text = RD("TownName")
            li.Value = RD("TownID")
            TownID.Items.Add(li)
        End While
        Conn.Close()
    End Sub

接著撈出所有村里資料

Sub GetVillage()
    VillageID.Items.Clear()
    Conn.Open()
    Dim sql As String = "Select row_number() Over (Order By TownID) R, TownID, VillageID, VillageName From ListVillage Order By TownID"
    Dim Comm As New SqlCommand(sql, Conn)
    Dim RD As SqlDataReader = Comm.ExecuteReader()
    While RD.Read()
        If RD("TownID") = 1 Then
           Dim li As New ListItem
           li.Text = RD("VillageName")
           li.Value = RD("VillageID")
           VillageID.Items.Add(li)
        End If
    End While    
    Conn.Close()
End Sub

'row_number() Over (Order By TownID as R  此段會新增一個R欄位,並且會依數列向下+1

簡單來說就是" 依照指定的欄位排序,並逐筆加上順號的方式 "-出處Topcat

'另外有 Rank over與 DENSE_RANK 可參考
https://dotblogs.com.tw/topcat/archive/2009/08/06/9906.aspx

接著寫下當Dropdownlist更動value值時所作的變化

  Protected Sub TownID_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TownID.SelectedIndexChanged
        Conn.Open()
        TownIDChanged(Request("ctl00$CP$TownID"))
        Conn.Close()
    End Sub

當Dropdownlist變化時,使用Requrest("ctl00$CP$TownID")代入 副程式 TownIDChanged的tid

Sub TownIDChanged(ByVal tid As Byte)
        Try
            VillageID.Items.Clear()
            Dim Comm As New SqlCommand("Select VillageID, VillageName From ListVillage Where TownID=" & tid & " Order By TownID", Conn)
            Dim RD As SqlDataReader = Comm.ExecuteReader()
            While RD.Read()
                Dim li As New ListItem
                li.Text = RD("VillageName")
                li.Value = RD("VillageID")
                VillageID.Items.Add(li)
            End While
            TownID.Text = Request("ctl00$CP$TownID")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

由TownID_SelectedIndexChanged取得tid

(Byval tid as Byte是將參數傳入)

去執行下面的SQL Query

備註:ctl00$CP$TownID,由於是在MasterPage,所以系統會指定一個特殊字元,要取得該字元,須由網頁上去看該元件ID。