Hi 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 创建数据库

 

SqlCode
--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 113113,'华阳镇',1004 from dual
union all
select 114 , 114,'沈阳市',1005 from dual
union all
select 115 , 115,'大连市',1005 from dual;
commit;


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

 

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

Content中的Themes 包含jQgrid的主题.

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

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

 

总体效果预览:


Edit

 

 

 

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 { getset; }
        
public string City_Code { getset; }
        
public string City_Name { getset; }
        
public int province_ID { getset; }
        
public bool IsActive { getset; }
    }
}


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 { getset; }
        
public string Province_Code { getset; }
        
public string Province_Name { getset; }
        
public bool Province_IsActive { getset; }
    }
}


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 { getset; }
        
//总页数
        public int TotalPageCount { getset; }
        
//总行数
        public int TotalRowCount { getset; }
        
//接收每个实体的集合
        public List<object> Rows { getprivate 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

 

 欢迎大家拍砖。。。。

 

 


 

posted @ 2011-01-24 16:07  子夜.  Views(12013)  Comments(12Edit  收藏  举报