jQgrid....20110124

  快过年了,给大家拜个早年. 做了个jQgrid的DEMO。哈哈。

 

 主要运用MVC 和 jQgrid(后期会加上Nhibernate 以及spring.Net)

环境  W-XP SP3+ VS2008SP1 + Oracle.

准备工作:

下载:

1、jquery.jqGrid-3.8.1.zip;

2、jquery-ui-1.8.6.custom2.zip;(这个样式可随便下载)

以上2个包以及源码在附件当中

 

打开ORACLE 创建数据库


--Create the province table and add some data
create table province
(
ProvinceID int,
ProvinceCode varchar(20),
ProvinceName varchar(20),
primary key (ProvinceID)
);
select * from province;

insert into province
select 1001 , 1001,'北京' from dual
union all
select 1002 , 1002,'天津' from dual
union all
select 1003 , 1003,'重庆' from dual
union all
select 1004 , 1004,'四川' from dual
union all
select 1005 , 1005,'辽宁' from dual;
commit;

----Create the city table and add some data
Create table city
(
CityID int,
CityCode varchar(20),
CityName varchar(20),
ProcinceID int,
primary key (CityID)
);

insert into city 
select 101 , 101,'北京市',1001 from dual
union all
select 102 , 102,'朝阳',1001 from dual
union all
select 103 , 103,'海淀',1001 from dual
union all
select 104 , 104,'昌平',1001 from dual
union all
select 105 , 105,'天津市',1002 from dual
union all
select 106 , 106,'重庆市',1003 from dual
union all
select 107 , 107,'南坪',1003 from dual
union all
select 108 , 108,'李家沱',1003 from dual
union all
select 109 , 109,'鱼洞',1003 from dual
union all
select 110 , 110,'界石',1003 from dual
union all
select 111 , 111,'成都市',1004 from dual
union all
select 112 , 112,'天府软件园',1004 from dual
union all
select 113, 113,'华阳镇',1004 from dual
union all
select 114 , 114,'沈阳市',1005 from dual
union all
select 115 , 115,'大连市',1005 from dual;
commit;

数据库创建好了后 看下系统的结构图(除Nhibernate、Spring.net):

 jQgrid....20110124_第1张图片

Common 文件里存放的是准备实现分页的部分.

Content中的Themes 包含jQgrid的主题.

Extension中包含的是MVC有无分页的JSON数据组装.

其他应该就是基本的MVC结构了。

 

总体效果预览:

jQgrid....20110124_第2张图片

Edit

jQgrid....20110124_第3张图片 

 

 

1、先把两个实体建立好

建立Entities文件夹  在其下建立两个实体类 分别为City,Province.

//City.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Marlboro.Web.Entities
{
    public class City
    {
        public int City_ID { get; set; }
        public string City_Code { get; set; }
        public string City_Name { get; set; }
        public int province_ID { get; set; }
        public bool IsActive { get; set; }
    }
}

 
//Province.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Marlboro.Web.Entities
{
    public class Province
    {
        public  int Province_ID { get; set; }
        public string Province_Code { get; set; }
        public string Province_Name { get; set; }
        public bool Province_IsActive { get; set; }
    }
}


2、在Controller下建立CityController

 CityController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using Marlboro.Web.Entities;
using Marlboro.Web.Extension;

namespace Marlboro.Web.Controllers
{
    public class CityController : Controller
    {
        //
        // GET: /City/

        public ActionResult Index()
        {
            return View();
        }


        /// <summary>
        /// 返回绑定的DROPDOWNLIST数据
        /// </summary>
        /// <returns></returns>
        public ActionResult Citylist()
        {
            ViewData["ProvinceList"] = new Marlboro.Web.Models.CityModels().GetDropdownlistItem();
            return View();
        }
        /// <summary>
        /// 通过省的ID 取出所有城市的JSON格式
        /// </summary>
        /// <param name="provinceId"></param>
        /// <returns></returns>
        public JsonResult Getlist(int? provinceId)
        {
            List<City> Citylist = new Marlboro.Web.Models.CityModels().Citylist(provinceId);
            var retVal = new Extension.BuildJson<City, int>(
                Citylist,
                city => city.City_ID,
                city => "",
                city => city.City_ID.ToString(),
                city => city.City_Code,
                city => city.City_Name,
                city => city.province_ID.ToString()
                ).Build();
            return Json(retVal, JsonRequestBehavior.AllowGet);
        }




        [HttpPost]
        public ActionResult Edit(long id, FormCollection collection)
        {

            try
            {
                //[0000055] bug fix
                string CityID = collection["CityID"];
                string code = collection["CityCode"];
                string name = collection["CityName"];
                string Provinceid = collection["ProvinceID"];

                if (string.IsNullOrEmpty(code))
                {
                    return this.Content("City code is required!");  
                }
              
                if (string.IsNullOrEmpty(name))
                {
                    return this.Content("City name is required!");
                }
                City c = new Marlboro.Web.Models.CityModels().GetCitylistByID(Convert.ToInt32(CityID));
                if (c == null)
                {
                    return this.Content("The city to be update has been deleted by another user.");
                }
               
                c.City_ID = Convert.ToInt32(CityID);
                c.City_Code = code;
                c.City_Name = name;
                c.province_ID = Convert.ToInt32(Provinceid);

                new Marlboro.Web.Models.CityModels().UpdateCityByID(c);
            }
            catch (Exception ex)
            {
                //this.Response.Headers["exceptionMessage"] = ex.Message;
                //throw ex;
                return this.Content(ex.Message);
            }
            return this.Content("");
        }

    }
}

 


 3、Models (暂时先写的SQL语句写的比较垃圾。后期打算合并NhiberNate)

CityModels.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Data;
using System.Collections;

using Marlboro.Web.Entities;

namespace Marlboro.Web.Models
{
    public class CityModels
    {

        /// <summary>
        /// 获取所有省信息 绑定Dropdownlist
        /// </summary>
        /// <returns></returns>
        public List<SelectListItem> GetDropdownlistItem()
        {
            List<SelectListItem> list = new List<SelectListItem>();
            DataTable Itemsdt = new DataTable();
            Itemsdt = new DataBaseTest.OracleHelper().ExecuteDataTable("select * from PROVINCE");
            if (Itemsdt.Rows.Count != 0)
            {
                for (int i = 0; i < Itemsdt.Rows.Count; i++)
                {
                    list.Add(new SelectListItem { Text = Itemsdt.Rows[i]["ProvinceName"].ToString(), Value = Itemsdt.Rows[i]["ProvinceID"].ToString() });
                }
            }
            return list ?? null;
        }

        /// <summary>
        /// 通过procinveId 获取City列表
        /// </summary>
        /// <param name="provinceId"></param>
        /// <returns></returns>
        public List<City> Citylist(int? provinceId)
        {

            List<City> Citylist = new List<City>();
            DataTable dt = new DataTable();
            dt = new DataBaseTest.OracleHelper().ExecuteDataTable("select * from City where ProcinceID='" + provinceId + "'");//where ProcinceID='" + provinceID + "'
            if (dt.Rows.Count != 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    City city = new City();
                    city.City_ID = Convert.ToInt32(dt.Rows[i]["CITYID"]);
                    city.City_Code = dt.Rows[i]["CITYCODE"].ToString();
                    city.City_Name = dt.Rows[i]["CITYNAME"].ToString();
                    city.province_ID = Convert.ToInt32(dt.Rows[i]["PROCINCEID"]);
                    Citylist.Add(city);
                }
            }
            return Citylist;
        }


        /// <summary>
        /// 通过CityID 获取实体
        /// </summary>
        /// <param name="CityID"></param>
        /// <returns></returns>
        public City GetCitylistByID(int? CityID)
        {
            City city = new City();
            DataTable dt = new DataTable();
            dt = new DataBaseTest.OracleHelper().ExecuteDataTable("select * from City where CITYID='" + CityID + "'");//where ProcinceID='" + provinceID + "'
            if (dt.Rows.Count != 0)
            {
                city.City_ID = Convert.ToInt32(dt.Rows[0]["CITYID"]);
                city.City_Code = dt.Rows[0]["CITYCODE"].ToString();
                city.City_Name = dt.Rows[0]["CITYNAME"].ToString();
                city.province_ID = Convert.ToInt32(dt.Rows[0]["PROCINCEID"]);
            }
            return city;
        }

        /// <summary>
        /// 更新City数据 提供给前台JS
        /// </summary>
        /// <param name="city"></param>
        public void UpdateCityByID(City city)
        {
            string sql = "update City set CITYCODE='" + city.City_Code + "',CITYNAME='" + city.City_Name + "',PROCINCEID='" + city.province_ID + "' where CITYID='" + city.City_ID + "'";
            new DataBaseTest.OracleHelper().ExcuteCity(sql);
        }
    }
}


4、建立文件夹Extension ,在文件夹下建立BuildJson类


using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Collections;
using System.Collections.Generic;
using Marlboro.Web.Common;

namespace Marlboro.Web.Extension
{
    public class BuildJson<TEntity, IdType>
    {
        /// <summary>
        /// MVC 无分页 Json数据构造
        /// </summary>
        /// <param name="entities">对象实体集合</param>
        /// <param name="idFunc">泛型委托,传入匿名函数lambda 传入TEntity 返回 IdType</param>
        /// <param name="propertyFuncs">泛型委托集合 用法同上</param>
        public BuildJson(
            List<TEntity> entities,
            Func<TEntity, IdType> idFunc,
            params Func<TEntity, string>[] propertyFuncs
            )
        {
            //无分页,实际分页为1
            this.ActualPageIndex = 1;
            //总页数为1
            this.TotalPageCount = 1;
            //总行数则为对象实体集合的实体个数
            this.TotalRowCount = entities.Count;
            //声明一个List来存入构造出的对象(每一行代表一个实体)
            this.Rows = new List<object>();

            //循环传入的实体集合
            foreach (TEntity entity in entities)
            {
                //声明一个obj的list来存放泛型委托集合中每个泛型委托返回的值
                List<string> obj = new List<string>();
                //循环泛型委托集合
                foreach (Func<TEntity, string> propertyFunc in propertyFuncs)
                {
                    //将每一个泛型委托 的返回值传入obj
                    obj.Add(propertyFunc(entity));
                }
                //将每个实体的ID 以及其他属性存入一个row当中
                this.Rows.Add(new
                {
                    id = idFunc(entity),
                    cell = obj.ToArray()
                });
            }

        }

        //实际页数
        public int ActualPageIndex { get; set; }
        //总页数
        public int TotalPageCount { get; set; }
        //总行数
        public int TotalRowCount { get; set; }
        //接收每个实体的集合
        public List<object> Rows { get; private set; }


        //数据组装
        public object Build()
        {
            return new
            {
                total = this.TotalPageCount,
                page = this.ActualPageIndex,
                records = this.TotalRowCount,
                rows = this.Rows
            };
        }


        /// <summary>
        /// MVC 分页 Json数据构造
        /// </summary>
        /// <param name="pagerResponse"></param>
        /// <param name="idFunc"></param>
        /// <param name="propertyFuncs"></param>
        public BuildJson(
            PagerResponse<TEntity> pagerResponse,
            Func<TEntity, IdType> idFunc,
            params Func<TEntity, string>[] propertyFuncs)
        {
            this.TotalRowCount = pagerResponse.TotalRowCount;
            this.ActualPageIndex = pagerResponse.ActualPageIndex;
            this.TotalPageCount = pagerResponse.PageCount;

            this.Rows = new List<object>();

            foreach (TEntity entity in pagerResponse.Entities)
            {
                List<string> obj = new List<string>();
                foreach (Func<TEntity, string> propertyFunc in propertyFuncs)
                {
                    obj.Add(propertyFunc(entity));
                }

                this.Rows.Add(
                    new
                    {
                        id = idFunc(entity),
                        cell = obj.ToArray()
                    });
            }
        }
    }
}

 这个代码应该很清晰了。

 下面就开始介绍VIEW

5、 建立City文件夹  在其下 建立Citylist.aspx


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Marlboro.Web.Models.CityModels>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <center>
        <%= Html.DropDownList("dplProvince", ViewData["ProvinceList"] as List<SelectListItem>)%></center>

    <script type="text/javascript">
        var JQGrid = function(provinceId) {
            $('#cityList').jqGrid({
                url: '<%= Url.Action("Getlist", "City") %>?provinceId=' + provinceId,
                datatype: 'json',
                colNames: ['Action', 'CityID', 'CityCode', 'CityName', 'ProvinceID',],
                colModel: [
                 { name: 'customZone', width: '200', sortable: false,align:'center' },
                   { name: 'CityID',index:'CityID', sortable: true,align:'center' },
                            { name: 'CityCode', index: 'CityCode', editable: true, sortable: true,align:'center'},
                            { name: 'CityName', index: 'CityName', editable: true, sortable: true,align:'center' },
                            { name: 'ProvinceID', index: 'ProvinceID', editable: true, sortable: true,align:'center' },
                ],
                rowNum: -1,
                caption: 'City List',
                viewrecords: true,
                autowidth: false,
                width:700,
                height: 'auto',
                gridComplete: function() {
                //传入行的ID 然后通过editBtn_id的事件来警醒editRow方法
                //从而实现了编辑状态
                    var editEvent = function(id) {
                        $('#editBtn_' + id).click(function() {
                            jQuery('#cityList').editRow(id);
                            return false;
                        });
                    }
                    //同理 获取code和name的值
                    //调用saveRow这个方法,方法中访问'<%=Url.Action("Edit","City") %>',CityController中的Edit方法来
                    //来进行保存的
                    var saveEvent = function(id) {
                        $('#saveBtn_' + id).click(function() {
                        
                            var code = $('#' + id + '_CityCode').val();
                            var name = $('#' + id + '_CityName').val();
                            if (code == '' || name == '') {
                                alert('City code/name is required!');
                            }
                            /*
                            else if (name.length > 10) {
                            alert('Hospital category name must be less than 10 characters!');
                            }*/
                            else {
                                jQuery('#cityList').saveRow(
                                    id,
                                    false,
                                    '<%=Url.Action("Edit","City") %>',
                                    null,
                                    function(id, xhr) {
                                        var msg = xhr.responseText;
                                        if (msg.length == 0) {
                                            alert("Saved successfully!");
                                        } else {
                                            jQuery('#cityList').editRow(id);
                                            alert("Failed because: " + msg);
                                        }
                                    },
                                    function(id, xhr) {
                                        var msg = xhr.getResponseHeader("exceptionMessage");
                                        alert(
                                            "Can not save data because of some unknown exception, HTTP status: " +
                                            xhr.status +
                                            ", server exception message: " +
                                            msg);
                                    });
                            }
                            return false;
                        });
                    }
                    var cancelEvent = function(id) {
                        $('#cancelBtn_' + id).click(function() {
                            jQuery('#cityList').restoreRow(id);
                            return false;
                        });
                    }
                    //最后把jQgrid中的每一行的事件注册上即可.
                    var ids = jQuery("#cityList").jqGrid('getDataIDs');
                    for (var i = 0; i < ids.length; i++) {
                        var cl = ids[i];
                        var editBtn = '<a href="javascript:void(0)" class="editBtn" title="Edit" id="editBtn_' + cl + '">Edit</a>';
                        var saveBtn = '<a href="javascript:void(0)" class="saveBtn" title="Save" id="saveBtn_' + cl + '">Save</a>';
                        var cancelBtn = '<a href="javascript:void(0)" class="cancelBtn" title="Cancel" id="cancelBtn_' + cl + '">Cancel</a>';

                        jQuery("#cityList").jqGrid('setRowData', ids[i], { customZone: editBtn + ' | ' + saveBtn + ' | ' + cancelBtn });
                        editEvent(cl);
                        saveEvent(cl);
                        cancelEvent(cl);
                    }
                }
            });
        };
        //这个功能在下一节实现.
        var CityCreate = function() {
            var provinceId = $('#dplProvince option:selected').val();
            if (provinceId == 0) {
                alert('Please select a province before creating new city.');
            }
            else {
                window.location.href = '<%= Url.Action("Create","City")%>/' + provinceId;
            }
        };
      
       //实现选择DDL 来ReloadjQgrid
        $(function() {
            $('#dplProvince').find('option:first').attr('selected', true);

            JQGrid();
            $("#dplProvince").change(function(){
                var provinceId = $(this).val();
                $("#cityList").setGridParam(
                {
                    url: '<%= Url.Action("Getlist", "City") %>?provinceId=' + provinceId
                }
                ).trigger("reloadGrid");
            });
        });   
    </script>

    <div style="text-align: center">
        <%--显示主数据的Table ID为list--%>
        <table id="cityList">
        </table>
        <%--分页用的DIV ID为pager--%>
        <div id="pager">
        </div>
    </div>
</asp:Content>

jQgrid的属性就不说了。

如果不是很清晰 传送门

 

Edit、Cancel、Save 3个方法

基本都是在

gridComplete

这个属性中写。

 这也是jQgrid强大的地方。 这篇文章介绍的是在不存在分页的jQgrid。

下一篇介绍有分页的jQgrid. 样式以及框架在以后调整...

 

 最后赋上 ORACLEHelper类+连接字符串。哈哈

OracleHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OracleClient;
using System.Configuration;
using System.Data;

namespace DataBaseTest
{
    public class OracleHelper
    {
        public static OracleConnection cn = null;
        public OracleHelper()
        {
        }

        public OracleConnection Open()
        {
            cn = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.171.142.12) (PORT=1522)))(CONNECT_DATA=(SERVICE_NAME=****)));Persist Security Info=True;User Id=****; Password=****");
            cn.Open();
            return (cn);
        }
        public void Close()
        {
            cn.Close();
        }
        /// <summary> 
        /// 返回DataSet 
        /// </summary> 
        /// <param name="CmdString"></param> 
        /// <param name="TableName"></param> 
        /// <returns></returns> 
        public DataSet GetDataSet(string CmdString)
        {
            Open();
            OracleDataAdapter myDa = new OracleDataAdapter();
            myDa.SelectCommand = new OracleCommand(CmdString, cn);
            DataSet myDs = new DataSet();
            myDa.Fill(myDs);
            Close();
            return myDs;
        }


        public void ExcuteCity(string sql)
        {
            Open();

            OracleCommand cmd = new OracleCommand(sql, cn);
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception er)
            {

                throw er;
            }
            finally
            {
                Close();
            }

        }

        /// <summary>
        /// get datatable by the cmdstring
        /// </summary>
        /// <param name="CmdString"></param>
        /// <returns></returns>
        public DataTable GetDataTable(string CmdString)
        {
            Open();
            DataTable dt = new DataTable();
            OracleDataReader dr = null;
            OracleCommand cmd = new OracleCommand();
            cmd.CommandText = CmdString;
            cmd.Connection = cn;
            using (dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(dr);
            }
            Close();
            return dt;
        }



        /// <summary> 
        /// 执行一个查询,并返回查询结果 
        /// </summary> 
        /// <param name="commandText">要执行的SQL语句</param> 
        /// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param> 
        /// <param name="parameters">PL-SQL 语句或存储过程的参数数组</param> 
        /// <returns></returns> 
        public DataTable ExecuteDataTable(string commandText)
        {
            Open();
            DataSet data = new DataSet();//实例化DataTable,用于装载查询结果集 
            using (OracleCommand command = new OracleCommand(commandText, cn))
            {
                //通过包含查询SQL的SqlCommand实例来实例化SqlDataAdapter 
                OracleDataAdapter adapter = new OracleDataAdapter(command);
                adapter.Fill(data);//填充DataTable 
            }
            Close();
            return data.Tables[0];
        }
    }
}

母版页中

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>
        <asp:ContentPlaceHolder ID="TitleContent" runat="server" />
    </title>
   
    <%--CSS文件--%>
    <%--引用Custom CSS文件--%>
    <link href="http://www.cnblogs.com/Content/Themes/dark-hive/jquery-ui-1.8.6.custom.css" rel="stylesheet"
        type="text/css" />
     <%--第二套CSS文件--%>
    <%--<link href="http://www.cnblogs.com/Content/Themes/ui-lightness/jquery-ui-1.8.6.custom.css" rel="stylesheet"
        type="text/css" />--%>
    <%--Jquery-ui的jqgrid CSS文件--%>
    <link href="http://www.cnblogs.com/Content/ui.jqgrid.css" rel="stylesheet" type="text/css" />
    
    <%--jQuery主文件 这里用1.4.2版本--%>

    <script src="http://www.cnblogs.com/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>

    <%--语言包,语言包一定要放在 jQgrid.min.js 前 这里引用英文--%>

    <script src="http://www.cnblogs.com/Scripts/i18n/grid.locale-en.js" type="text/javascript"></script>

    <%--最后就是jQgrid的JS文件了--%>

    <script src="http://www.cnblogs.com/Scripts/jquery.jqGrid.min.js" type="text/javascript"></script>

</head>
<body>
    <div class="page">
        <div id="header">
            <div id="title" style="text-align:center">
                <h1>
                    Hi~ jqGrid</h1>
            </div>
        </div>
        <div id="main">
            <asp:ContentPlaceHolder ID="MainContent" runat="server" />
            <div id="footer">
            </div>
        </div>
    </div>
</body>
</html>


 文章中的相关下载(jQgrid包、两套样式、源码)

 jQgridDemo


全文完.

你可能感兴趣的:(jquery,exception,function,String,dataset,stylesheet)