ASP.NET探寻

itzhiren的Blog

导航

连接数据库实现客户端脚本控制的二级联动下拉菜单(二)

Posted on 2006-09-02 12:18  itzhiren  阅读(1282)  评论(2)    收藏  举报

和(一)比较,这个示例使用了StringBuilder构造含客户端控制脚本的字符串,并且用到了Environment.NewLine实现换行.下面是代码:
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="system.data" %>
<%@ Import Namespace="system.data.oledb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    Public Sub page_load(ByVal o As Object, ByVal e As System.EventArgs)
        '建立数据库连接
        Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("DB_ProvinceCat.mdb") & ";User Id=;Password=;") '如果设置了web.config,也可以从web.config中读取数据库连接字符串
        conn.Open()
        Dim cmd As OleDbCommand = New OleDbCommand
        cmd.Connection = conn

        '=====================================================================================
        '生成客户端脚本控制的联动菜单
        '查询Tb_Province表获得所有的省份
        Dim sqlstr As String = "SELECT ProvinceCode, ProvinceName FROM Tb_Province order by ProvinceCode"
        cmd.CommandText = sqlstr
        Dim sqlda As OleDbDataAdapter = New OleDbDataAdapter(cmd)
        '建立临时表存储省份数据
        Dim Province As DataTable = New DataTable
        sqlda.Fill(Province)
        'Response.Write("将省份数据绑定到DropDownList1控件")
        'Response.End()

        '将省份数据绑定到DropDownList1控件
        DropDownList1.DataSource = Province
        DropDownList1.DataValueField = "ProvinceCode"
        DropDownList1.DataTextField = "ProvinceName"
        If Not IsPostBack Then DropDownList1.DataBind()
       
        '获取省份的个数
        Dim ProvinceNum As Integer = Province.Rows.Count()

        '使用StringBuilder构造含客户端控制脚本的字符串
        Dim sbscript As New System.Text.StringBuilder
        sbscript.Append("<script><!--")
        sbscript.Append(Environment.NewLine & "var group=new Array(" & ProvinceNum & ");" & Environment.NewLine & "for (i=0; i<" & ProvinceNum & "; i++){group[i] = new Array()}" & Environment.NewLine)
        '循环从省份临时表中取出一个省份,然后在数据库中查询此省份下的城市
        Dim i As Integer
        Dim j As Integer
        Dim tempclass As DataTable
        Dim CityNum As Integer
       
       
        For i = 0 To ProvinceNum - 1
            sqlstr = "SELECT CityCode, CityName FROM Tb_City WHERE Left(CityCode,2) = '" & Province.Rows(i)(0) & "' order by CityCode"
            cmd.CommandText = sqlstr
            sqlda = New OleDbDataAdapter(cmd)
            tempclass = New DataTable
            sqlda.Fill(tempclass)
            CityNum = tempclass.Rows.Count()
            'Response.Write("省份:" & Province.Rows(i)(0) & "有市" & CityNum & "个<br>")
            '将读取到的城市数据放入客户端脚本中
            For j = 0 To CityNum - 1
                sbscript.Append("group[" & i & "][" & j & "]=new Option(""" & tempclass.Rows(j)(1) & """,""" & tempclass.Rows(j)(0) & """);" & Environment.NewLine)
            Next
        Next
       
        '加入客户端脚本控制代码
        sbscript.Append(Environment.NewLine & "function Redirect(x){" & Environment.NewLine & "for (m=Form1.DropDownList2.options.length-1;m>0;m--){Form1.DropDownList2.options[m]=null}")
        sbscript.Append(Environment.NewLine & "if (group[x].length==0){")
        sbscript.Append(Environment.NewLine & "Form1.DropDownList2.options[0]=new Option('---请选择---','无')}")
       
        sbscript.Append(Environment.NewLine & "for (i=0;i<group[x].length;i++){" & Environment.NewLine & "Form1.DropDownList2.options[i]=new Option(group[x][i].text,group[x][i].value)}")
        sbscript.Append(Environment.NewLine & "Form1.DropDownList2.options[0].selected=true;Form1.classid.value=Form1.DropDownList2.options[0].value;}")

        sbscript.Append(Environment.NewLine & "function choose(x){Form1.classid.value=Form1.DropDownList2.options[x].value;}")
        sbscript.Append(Environment.NewLine & "-->")
        sbscript.Append("<")
        sbscript.Append("/")
        sbscript.Append("script>")

        '注册客户端脚本,将脚本内容写入客户端输出流
        Dim strscript As String = sbscript.ToString()
       
        If (Not IsClientScriptBlockRegistered("clientScript")) Then
            RegisterClientScriptBlock("clientScript", strscript)
        End If
        '=====================================================================================

        '初始化DropDownList2中的内容
        sqlstr = "SELECT CityCode,CityName FROM Tb_City WHERE (Left(CityCode,2) = '" & Province.Rows(0)(0) & "')"
        cmd.CommandText = sqlstr
        sqlda = New OleDbDataAdapter(cmd)

        Dim dtCity As DataTable = New DataTable
        sqlda.Fill(dtCity)

        DropDownList2.DataSource = dtCity
        DropDownList2.DataValueField = "CityCode"
        DropDownList2.DataTextField = "CityName"
        If Not IsPostBack Then DropDownList2.DataBind()

        sqlda.Dispose()
        cmd.Dispose()
        conn.Close()
       
        'DropDownList1.Attributes.Add("OnChange", "Redirect(this.options.selectedIndex)")
    End Sub
   
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="Form1" runat="server">
    <div>
         省份:<asp:DropDownList ID="DropDownList1" runat="server" onchange="Redirect(this.options.selectedIndex)" >
        </asp:DropDownList>

        城市:<asp:DropDownList ID="DropDownList2" runat="server" onchange="choose(this.options.selectedIndex)">
        </asp:DropDownList>
        <P><INPUT id="classid" type="text" runat="server"></P>
        </div>
    </form>
</body>
</html>

总结:
Environment 成员:提供有关当前环境和平台的信息以及操作它们的方法。无法继承此类。
公共属性:

NewLine 获取为此环境定义的换行字符串。