根据班级获取学员下拉框数据

前台页面

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title>根据班级获取学员下拉框数据</title>

    <script type="text/javascript" >

        //1.页面加载完毕后创建异步对象  请求班级数据

        window.onload = function () {

            //1.1创建异步对象

            var xhr = new XMLHttpRequest();

            //1.2设置参数

            xhr.open("get", "GetData.ashx?type=1", true);

            //1.3设置不使用浏览器缓存

            xhr.setRequestHeader("If-Modified-Since", "0");

            //1.4设置回调函数

            xhr.onreadystatechange = function () {

                //当完全接收完响应报文后,并且 响应状态码为200的时候

                if (xhr.readyState == 4 && xhr.status == 200) {

                    //[{'id':'1','name':'1班'},{'id':'2','name':'2班'},{'id':'3','name':'3班'}]

                    var res = xhr.responseText;//获取响应报文体内容



                    //===============将数据转成js数组============

                    //var resJson = eval(res);//第一种转换方法



                    //标准json格式[{"id":"1","name":"1班"},{"id":"2","name":"2班"}]

                    //将 接收到的 json字符串 转换成  json对象

                    //注意:json其实是一种  数据传输的  格式(json格式满足js字面量表示法语法)   浏览器和服务器端  实际  不存在 所谓的  json 对象   其实就是js对象

                    var jsonArr = JSON.parse(res);//第二种转换方法     注意:用这种格式转换的时候属性名必须用双引号

                    loadSel("selClass", jsonArr, "id", "name");

                    //========================================



                    //alert(resJson2.length);

                    //document.getElementById("selClass").innerHTML = res;

                }

            }

            //1.5发送异步请求

            xhr.send(null);

        };

        /*

            生成下拉框选项

        */

        function loadSel(selId, dataArr, valueField, textField) {

            //根据id获取下拉框

            var selObj = document.getElementById(selId);

            //清空下拉框选项

            selObj.options.length = 0;

            //遍历数据数组

            for (var i = 0; i < dataArr.length; i++) {

                //取出数据元素

                var item = dataArr[i];    //item.id    item.name方式来访问  或者item["id"]    item["name"]  来访问

                //创建  下拉框选项  对象

                var opt = new Option(item[textField], item[valueField]);

                //添加到下拉框中

                selObj.options.add(opt);

            }

        }

    </script>

</head>

<body>

    <div id="divCon">

        班级:<select id="selClass"><option>哇哈哈哈</option></select>

        学生:<select id="selStu"></select>

    </div>

</body>

一般处理程序GetData.ashx.cs:

public void ProcessRequest(HttpContext context)

        {

            //1.获取参数  Type

            string strType = context.Request.Params["type"];

            //2.根据type调用不同的方法

            switch (strType)

            {

                case "1"://加载班级列表数据

                    LoadClassData(context);

                    break;

            }

        }



        #region 加载班级列表数据 -- void LoadClassData(HttpContext context)

        /// <summary>

        /// 加载班级列表数据

        /// </summary>

        /// <param name="context"></param>

        void LoadClassData(HttpContext context)

        {

            //读取班级数据

            DataTable dt= DbHelperSQL.GetDataTable("select * from Class where CIsDel=0");

            //注意[{},{},{}]    外面的【】是数组的字面量表示法    里面的{}是对象的字面量表示法

            //[{'id':'1','name':'1班'},{'id':'2','name':'2班'},{'id':'3','name':'3班'}]

            //标准json格式 : [{"id":"1","name":"1班"},{"id":"2","name":"2班"}]

            //json格式最大的要求就是  所有的键必须要加双引号,值 : 如果是字符串也必须要加双引号

            System.Text.StringBuilder sbOpts = new System.Text.StringBuilder("[",200);

            foreach (DataRow dr in dt.Rows)

            {

                //可以直接生成html 发给浏览器     但 缺点:传输量大   浏览器端不灵活(如果浏览器要显示班级表格呢?)

                //sbOpts.Append("<option value='" + dr["CId"] + "'>" + dr["CName"] + "</option>");

                sbOpts.Append("{\"id\":\"" + dr["CId"] + "\",\"name\":\"" + dr["CName"] + "\"},");

            }

            context.Response.Write(sbOpts.Remove(sbOpts.Length-1,1).ToString()+"]");//最后多一个“,”所以要截取

        } 

        #endregion

 dbhelper文件:

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using System.Reflection;//反射命名空间



namespace Ajax

{

    /// <summary>

    /// 数据层 - 数据库 操作类

    /// </summary>

    internal class DbHelperSQL

    {

        //获得配置文件的连接字符串

        public static string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;



        #region 01.查询数据表 +static DataTable GetTabel(string strSql, params SqlParameter[] paras)

        /// <summary>

        /// 查询数据表

        /// </summary>

        /// <param name="strSql">sql语句</param>

        /// <param name="paras">参数数组</param>

        /// <returns></returns>

        public static DataTable GetDataTable(string strSql, params SqlParameter[] paras)

        {

            DataTable dt = null;

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                //创建 适配器对象(sql命令,连接通道)

                SqlDataAdapter da = new SqlDataAdapter(strSql, conn);

                //添加参数

                da.SelectCommand.Parameters.AddRange(paras);

                //创建数据表对象

                dt = new DataTable(); 

                //适配器 读取数据库,并将查询的结果 装入程序的 dt里

                da.Fill(dt);

            }

            return dt;

        } 

        #endregion



        #region 02.执行 增删改 (非查询语句) +int ExcuteNonQuery(string strSql, params SqlParameter[] paras)

        /// <summary>

        /// 执行 增删改 (非查询语句)

        /// </summary>

        /// <param name="strSql"></param>

        /// <param name="paras"></param>

        /// <returns></returns>

        public static int ExcuteNonQuery(string strSql, params SqlParameter[] paras)

        {

            int res = -1;

            //创建连接通道

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                //创建命令对象(sql语句,连接通道)

                SqlCommand cmd = new SqlCommand(strSql, conn);

                //添加参数

                cmd.Parameters.AddRange(paras);

                conn.Open();

                res = cmd.ExecuteNonQuery();

            }

            return res;

        } 

        #endregion

        

        #region 02a.执行 多条增删改 (非查询语句) +int ExcuteNonQuery(string strSql, params SqlParameter[] paras)

        /// <summary>

        /// 执行 多条增删改 (非查询语句)

        /// </summary>

        /// <param name="strSql"></param>

        /// <param name="paras"></param>

        /// <returns></returns>

        public static int ExcuteNonQuerys(string[] strSqls, SqlParameter[][] paras2Arr)

        {

            int res = 0;

            //创建连接通道

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                conn.Open();

                //创建 事务

                SqlTransaction tran = conn.BeginTransaction();

                //创建命令对象

                SqlCommand cmd = new SqlCommand();

                //为命令对象指定连接通道

                cmd.Connection = conn;

                //为命令对象指定事务

                cmd.Transaction = tran;

                try

                {

                    //循环执行sql语句

                    for (int i = 0; i < strSqls.Length; i++)

                    {

                        //获得要执行的sql语句

                        string strSql = strSqls[i];

                        //为命令对象指定 此次执行的 sql语句

                        cmd.CommandText = strSql;

                        //添加参数

                        if (paras2Arr.Length > i)//如果 参数2维数组的长度大于当前循环的下标

                        {

                            cmd.Parameters.AddRange(paras2Arr[i]);//将 交错数组 的第一个元素(其实也是一个数组,添加到参数集合中)

                        }

                        res += cmd.ExecuteNonQuery();

                        cmd.Parameters.Clear();

                    }

                    tran.Commit();//提交事务

                }

                catch (Exception ex)

                {

                    res = 0;

                    tran.Rollback();//回滚事务

                    throw ex;

                }

            }

            return res;

        }

        #endregion



        #region 02.执行 查询单个值 +int ExcuteScalar(string strSql, params SqlParameter[] paras)

        /// <summary>

        /// 执行 增删改 (非查询语句)

        /// </summary>

        /// <param name="strSql"></param>

        /// <param name="paras"></param>

        /// <returns></returns>

        public static int ExcuteScalar(string strSql, params SqlParameter[] paras)

        {

            int res = -1;

            //创建连接通道

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                //创建命令对象(sql语句,连接通道)

                SqlCommand cmd = new SqlCommand(strSql, conn);

                //添加参数

                cmd.Parameters.AddRange(paras);

                conn.Open();

                res = Convert.ToInt32(cmd.ExecuteScalar());

            }

            return res;

        }

        #endregion



        #region 04.执行 特殊的 分页存储过程 +DataTable GetPageListByProc(int pageIndex, int pageSize,out int pageCount,out int rowCount)

        /// <summary>

        ///04.执行 特殊的 分页存储过程

        /// </summary>

        /// <param name="proName">存储过程名称</param>

        /// <param name="pageIndex">页码</param>

        /// <param name="pageSize">页容量</param>

        /// <param name="userId">用户id</param>

        /// <param name="pageCount">总页数--输出</param>

        /// <param name="rowCount">总行数--输出</param>

        /// <returns></returns>

        public static DataTable GetPageListByProc(string proName,int pageIndex, int pageSize, int userId, out int pageCount, out int rowCount)

        {

            DataTable dt = new DataTable();

            //创建连接通道

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                //创建适配器对象

                SqlDataAdapter da = new SqlDataAdapter(proName, conn);

                //设置 命令类型 为存储过程

                da.SelectCommand.CommandType = CommandType.StoredProcedure;

                //设置 参数

                da.SelectCommand.Parameters.AddWithValue("@pi", pageIndex);//当前页码

                da.SelectCommand.Parameters.AddWithValue("@ps", pageSize);//页容量

                

                //在存储过程中 输出参数

                da.SelectCommand.Parameters.Add(new SqlParameter("@pc", SqlDbType.Int));

                da.SelectCommand.Parameters.Add(new SqlParameter("@rc",SqlDbType.Int));

                //将后面两个参数 设置为 输出类型

                da.SelectCommand.Parameters[2].Direction = ParameterDirection.Output;

                da.SelectCommand.Parameters[3].Direction = ParameterDirection.Output;

                da.SelectCommand.Parameters.AddWithValue("@uid", userId);

                //执行 并将查询到的 结果 赋给 数据表对象

                da.Fill(dt);

                //获得 存储过程 返回的 输出参数

                rowCount = Convert.ToInt32(da.SelectCommand.Parameters[2].Value);

                 pageCount= Convert.ToInt32(da.SelectCommand.Parameters[3].Value);

            }

            //返回数据表

            return dt;

        } 

        #endregion



        #region 04.执行 特殊的 分页存储过程 +DataTable GetPageListByProc(int pageIndex, int pageSize,out int pageCount,out int rowCount)

        /// <summary>

        ///04.执行 特殊的 分页存储过程

        /// </summary>

        /// <param name="proName">存储过程名称</param>

        /// <param name="pageIndex">页码</param>

        /// <param name="pageSize">页容量</param>

        /// <param name="userId">用户id</param>

        /// <param name="pageCount">总页数--输出</param>

        /// <param name="rowCount">总行数--输出</param>

        /// <returns></returns>

        public static int ExcuteNonQueryWithProc(string proName, params SqlParameter[] paras)

        {

            DataTable dt = new DataTable();

            //创建连接通道

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                SqlCommand cmd = new SqlCommand(proName,conn);

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddRange(paras);

                conn.Open();

                return cmd.ExecuteNonQuery();

            }

        }

        #endregion



        #region 01.3为 对象数据源控件 提供 分页数据

        /// <summary>

        /// 01.3为 对象数据源控件 提供 分页数据

        /// </summary>

        /// <param name="pageSize">页容量</param>

        /// <param name="startRowIndex">起始行下标</param>

        /// <returns></returns>

        public static DataTable GetPagedListForObjectDataSource(int pageSize, int startRowIndex)

        {

            string strSql = "select * from(select Row_Number() over(order by cid) as num, * from Classes)as temp where num>@startRowIndex and num<=@size";

            SqlParameter[] paras = { 

                                   new SqlParameter("@startRowIndex",startRowIndex),

                                   new SqlParameter("@size",pageSize+startRowIndex)

                                   };

            return GetDataTable(strSql, paras);

        } 

        #endregion



        #region 3.执行查询多行语句 - 返回数据读取器  +static SqlDataReader ExcuteDataReader(string strSelectCmd, params SqlParameter[] paras)

        /// <summary>

        /// 执行查询多行语句 - 返回数据读取器

        /// </summary>

        /// <param name="strSelectCmd"></param>

        /// <param name="paras"></param>

        /// <returns></returns>

        public static SqlDataReader ExcuteDataReader(string strSelectCmd, params SqlParameter[] paras)

        {

            SqlConnection conn = null;

            try

            {

                //1.创建连接通道

                conn = new SqlConnection(strConn);

                //2.创建命令对象

                SqlCommand cmd = new SqlCommand(strSelectCmd, conn);

                //3.添加命令参数

                cmd.Parameters.AddRange(paras);

                //4.打开连接

                conn.Open();

                //5.创建读取器(当关闭此读取器时,会自动关闭连接通道)

                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);//当关闭此读取器时,会自动关闭连接通道

                //6.返回读取器

                return dr;

            }

            catch (Exception ex)

            {

                conn.Dispose();

                throw ex;

            }

        }

        #endregion



        #region  2.0升级泛型版 ------ 执行查询多行语句 - 返回数据表

        /// <summary>

        /// 2.0升级泛型版 ------ 执行查询多行语句 - 返回数据表

        /// </summary>

        /// <typeparam name="T2">泛型类型</typeparam>

        /// <param name="strSelectCmd">查询sql语句</param>

        /// <param name="paras">查询参数</param>

        /// <returns>泛型集合</returns>

        public static List<T2> ExcuteList<T2>(string strSelectCmd, params SqlParameter[] paras)

        {

            //1.创建连接通道

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                //2.创建适配器

                SqlDataAdapter da = new SqlDataAdapter(strSelectCmd, conn);

                //2.1设置查询命令的参数

                da.SelectCommand.Parameters.AddRange(paras);

                //3.数据表

                DataTable dt = new DataTable();

                //4.将数据查询并填充到数据表中

                da.Fill(dt);

                //5.将DataTable转成泛型集合List<T2>

                if (dt.Rows.Count > 0)

                {

                    //6.创建泛型集合对象

                    List<T2> list = new List<T2>();

                    //7.遍历数据行,将行数据存入 实体对象中,并添加到 泛型集合中list

                    foreach (DataRow row in dt.Rows)

                    {

                        //留言:等学完反射后再讲~~~~!

                        //7.1先获得泛型的类型(里面包含该类的所有信息---有什么属性啊,有什么方法啊,什么字段啊....................)

                        Type t = typeof(T2);

                        //7.2根据类型创建该类型的对象

                        T2 model = (T2)Activator.CreateInstance(t);// new MODEL.Classes()

                        //7.3根据类型 获得 该类型的 所有属性定义

                        PropertyInfo[] properties = t.GetProperties();

                        //7.4遍历属性数组

                        foreach (PropertyInfo p in properties)

                        {

                            //7.4.1获得属性名,作为列名

                            string colName = p.Name;

                            //7.4.2根据列名 获得当前循环行对应列的值

                            object colValue = row[colName];

                            //7.4.3将 列值 赋给 model对象的p属性

                            //model.ID=colValue;

                            p.SetValue(model, colValue, null);

                        }

                        //7.5将装好 了行数据的 实体对象 添加到 泛型集合中 O了!!!

                        list.Add(model);

                    }

                    return list;

                }

            }

            return null;

        }

        #endregion



        #region 6.查询结果集里的第一个单元格的值(单个值)-- 泛型版本 + static T ExcuteScalar<T>(string strSelectCmd, params SqlParameter[] paras)

        /// <summary>

        /// 查询结果集里的第一个单元格的值(单个值)-- 泛型版本

        /// </summary>

        /// <typeparam name="T">类型参数</typeparam>

        /// <param name="strSelectCmd"></param>

        /// <param name="paras"></param>

        /// <returns></returns>

        public static T ExcuteScalar<T>(string strSelectCmd, params SqlParameter[] paras)

        {

            using (SqlConnection conn = new SqlConnection(strConn))

            {

                SqlCommand cmd = new SqlCommand(strSelectCmd, conn);

                cmd.Parameters.AddRange(paras);

                conn.Open();

                object o = cmd.ExecuteScalar();

                return (T)Convert.ChangeType(o, typeof(T));

            }

        }

        #endregion



        #region 将数据表 转成对应 T2 类型的泛型集合对象

        /// <summary>

        /// 将数据表 转成对应 T2 类型的泛型集合对象

        /// </summary>

        /// <typeparam name="T2">泛型类型</typeparam>

        /// <returns>泛型集合</returns>

        public static List<T2> Table2List<T2>(DataTable dt)

        {

            //5.将DataTable转成泛型集合List<T2>

            if (dt.Rows.Count > 0)

            {

                //6.创建泛型集合对象

                List<T2> list = new List<T2>();

                //7.遍历数据行,将行数据存入 实体对象中,并添加到 泛型集合中list

                foreach (DataRow row in dt.Rows)

                {

                    //留言:等学完反射后再讲~~~~!

                    //7.1先获得泛型的类型(里面包含该类的所有信息---有什么属性啊,有什么方法啊,什么字段啊....................)

                    Type t = typeof(T2);

                    //7.2根据类型创建该类型的对象

                    T2 model = (T2)Activator.CreateInstance(t);// new MODEL.Classes()

                    //7.3根据类型 获得 该类型的 所有属性定义

                    PropertyInfo[] properties = t.GetProperties();

                    //7.4遍历属性数组

                    foreach (PropertyInfo p in properties)

                    {

                        //7.4.1获得属性名,作为列名

                        string colName = p.Name;

                        //7.4.2根据列名 获得当前循环行对应列的值

                        object colValue = row[colName];

                        //7.4.3将 列值 赋给 model对象的p属性

                        //model.ID=colValue;

                        p.SetValue(model, colValue, null);

                    }

                    //7.5将装好 了行数据的 实体对象 添加到 泛型集合中 O了!!!

                    list.Add(model);

                }

                return list;

            }

            return null;

        }

        #endregion



        public static void PrepareCommand(SqlCommand cmd, SqlConnection conn,SqlTransaction trans, CommandType type, string cmdText, SqlParameter[] cmdParms)

        {

            if (conn.State != ConnectionState.Open) conn.Open();

            cmd.Connection = conn;

            cmd.CommandText = cmdText;

            cmd.CommandType = type;

            if (trans != null) cmd.Transaction = trans;

            if (cmdParms != null)

            {

                foreach (SqlParameter parameter in cmdParms)

                {

                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&

                        (parameter.Value == null))

                    {

                        parameter.Value = DBNull.Value;

                    }

                    cmd.Parameters.Add(parameter);

                }

            }

        }

    }

}

 

你可能感兴趣的:(下拉框)