1. 程式人生 > >datagrid資料表格使用總結

datagrid資料表格使用總結

一、載入的css檔案

  1. easyui 基本樣式: <link href="../easyui/easyui1.5.css" rel="stylesheet" type="text/css" />
  2. easyui 按鈕樣式:<link href="../easyui/icon.css" rel="stylesheet" type="text/css" />  表單需要進行編輯時按鈕所需樣式

二、載入的js檔案

  1. JQuery基本指令碼:<script type="text/javascript" src="../JQ/jquery.min.js"></script>
  2. EasyUI基本指令碼:<script type="text/javascript" src="../JQ/jquery.easyui.min.js"></script>
  3. DataGrid指令碼:<script src="../JQ/datagrid-detailview.js" type="text/javascript"></script>

三、Html - body部分: <table id="dg" class="easyui-datagrid"></table>

       若一個頁面具有多個表格,即id值不同即可,如

                <div class="dataContent" style="margin-top: 10px">
                    狀態統計
                </div>
                <table id="dg" class="easyui-datagrid">
                </table>
                <div class="dataContent" style="margin-top: 10px">
                    狀態明細
                </div>
                <table id="dgdetail" class="easyui-datagrid">
                </table>

四、Javascript指令碼

       對於動態載入表格資料,一般需要兩個步驟:

        (1) 頁面載入時初始化表格樣式

 1 <script type="text/javascript">
 2         $(function () {
 3            initTable();
 4         });
 5         // 初始化表格
 6         function initTable() {
 7             $('#dg').datagrid({
 8                 width: 1000,   //寬度
 9                 height: 210,    //高度
10                 url: 'StateQuery.aspx',  //請求資料URL
11                 singleSelect: true, //true表示只允許選擇一行
12                 onLoadSuccess: function (data) {//當資料載入成功時觸發,data為載入資料
13                     loadNoRecord(data);
14                 },
15                 onClickRow: function (rowIndex, rowData) {//當用戶點選一行時觸發,引數包括:rowIndex:被點選行的索引,從0開始;rowData:被點選行對應的記錄 
16                     loadDetail(rowIndex, rowData)
17                 },
18                 columns: [[ //表格對應列的匹配物件
19                     { field: 'ID', width: 40, halign: 'center', title: 'MinRID', hidden: true },
20                     { field: 'CenterName', width: 140, align: 'center', title: '名稱' },
21                     { field: 'ClassName', width: 80, align: 'center', title: '班次' },
22                     { field: 'Duration', width: 100, align: 'center', title: '持續時間(分)', formatter: formateFloat },
23                     { field: 'CreateTime', width: 140, align: 'center', title: '日期', formatter: formateDate },
24                     {
25                         field: 'Search', title: '詳細資訊', width: 100, align: 'center',
26                         formatter: function (value, row, index) {
27                             return '<a href="#" onclick="loadDetail(' + index + ',' + row + ')">檢視</a> '
28                         }
29                     }
30                 ]]
31             });
32         }
33         // 資料格式化
34         function formateFloat(data) {
35             if (data == undefined && data == "") return "";
36             return fn.format(data, 2);
37         }
38         // 日期格式化
39         function formateDate(data) {
40             if (data == undefined && data == "") return "";
41 
42             var n = data.indexOf(" ");
43             if (n > 0) return data.substring(0, n);
44             else return data;
45         }
46 </script>
初始化表格

        (2) 通過ajax動態載入表格資料

<input type="button" class="btn_tab" value="查詢" onclick="loadTable()" />

<script type="text/javascript">
        //載入資料
        function loadTable() {
            var centerid = $("#hdcenterid").val();

            ajax("ajax=getDataQuery&cid=" + centerid, function (q) {
                    if (!q) { //無資料
                        $("#dg").datagrid("loadData", []);
                    }
                    else { //有資料                     
                        q = json(q);
                        $("#dg").datagrid("loadData", q);
                    }
                });
        }
</script>
動態載入資料

        以上即為實現基本表格所需指令碼,如要實現其他功能只需根據EasyUI提供的樣例,在初始化表格樣式增加相關方法或屬性(部分功能見下文)

五、C#後臺資料,通過ajax非同步回撥得到DataTable,其中Column列名需要與初始化表格樣式中columns的field完全一致(區分大小寫),將其資料轉換為json字元返回即可。

using System;
using System.Data;
using iPlant.Component.ProfitCenter;

public partial class Component_ProfitCenter_StateAnalysis_StateQuery : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        #region 非同步回撥
        if (Request["ajax"] != null)
        {
            string ajax = "";
            if (Request.Form["ajax"] != null || Request.QueryString["ajax"] != null)
            {
                ajax = Request.Form["ajax"] != null ? Request.Form["ajax"] : Request.QueryString["ajax"];
                switch (ajax)
                {
                    case "getDataQuery": ajax = GetDataQuery(); break;//返回狀態記錄
                    default: break;
                }
                Response.Write(ajax);
                Response.End();
                return;
            }
        }
        #endregion
    }

    private string GetDataQuery()
    {
        int cid = 0;
        if (Request.Form["cid"] != null || Request.QueryString["cid"] != null)
        {
            cid = Request.Form["cid"] != null ? Request.Form["cid"] : Request.QueryString["cid"];
        }

        StateRecordCnfg cnfg = new StateRecordCnfg();
        DataTable dt = cnfg.GetStateRecordQuery(cid);
        return fn.Json(dt);
    }
}
後臺資料

六、實現效果

七、表格其他功能

1. 多行表頭 : 使用列(Column)屬性,Column是一個數組物件,它的每個元素也是一個數組。元素陣列的元素是一個配置物件,它定義了每個列的欄位。(詳見 http://www.jeasyui.net/plugins/183.html

    根據所需表頭,使用rowspan(number  指示一個單元格佔據多少行)和colspan(number 指示一個單元格佔據多少列)進行標記。

 1 function initDetailTable() {
 2             $('#dg').datagrid({
 3                 singleSelect: true,
 4                 width: "96%",
 5                 height: 220,
 6                 columns: [[
 7                     { field: 'Name', width: 120, align: 'center', title: '狀態名稱', rowspan: 2 },
 8                     { field: 'StateTime', width: 105, align: 'center', title: '開始時間', rowspan: 2 },
 9                     { field: 'EndTime', width: 105, align: 'center', title: '結束時間', rowspan: 2 },
10                     { field: 'Duration', width: 75, align: 'center', title: '持續時間(分)', formatter: formateFloat, rowspan: 2 },
11                     { title: '成本項', align: 'center', colspan: 5 },
12                     { field: 'CreateTime', width: 105, align: 'center', title: '生成時間', rowspan: 2 }
13                 ], [
14                     { field: 'ItemName', width: 80, align: 'center', title: '名稱' },
15                     { field: 'UseAmount', width: 60, align: 'center', title: '用量值', formatter: formateFloat },
16                     { field: 'Unit', width: 60, align: 'center', title: '單位' },
17                     { field: 'UnitPrice', width: 60, align: 'center', title: '單價' },
18                     { field: 'UseCost', width: 60, align: 'center', title: '成本', formatter: formateFloat }
19                 ]],
20                 onLoadSuccess: function (data) {
21                     loadCellStyle(data);
22                 }
23             });
24         }
多行表頭

    效果圖

 

2. 合併單元格:將資訊相同的資料只顯示一次,進行同類合併

 1 function loadCellStyle(data) {
 2    if (data.rows != undefined) {
 3        if (data.rows.length > 0) {
 4               var mark = 1;//這裡涉及到簡單的運算,mark是計算每次需要合併的格子
 5               for (var i = 1; i < data.rows.length; i++) {     //這裡迴圈表格當前的資料
 6                    if (data.rows[i]['StateRecordID'] == data.rows[i - 1]['StateRecordID']) {   //後一行的值與前一行的值做比較,相同就需要合併
 7                        mark += 1;
 8                        $('#dg').datagrid('mergeCells', {
 9                              index: i + 1 - mark,                //datagrid的index,表示從第幾行開始合併,就是記住最開始需要合併的位置
10                              field: 'StateName',                 //合併單元格的區域,就是clomun中的filed對應的列,StateName為狀態名稱
11                              rowspan: mark                       //縱向合併的格數,如果想要橫向合併,就使用colspan:mark
12                             });
13 
14                        //合併其他列,只需要修改其field值
15                        $('#dg').datagrid('mergeCells', {
16                              index: i + 1 - mark, 
17                              field: 'CreateTime',                //CreateTime為持續時間(分)
18                              rowspan: mark
19                              });
20                     } else {
21                             mark = 1;                            //一旦前後兩行的值不一樣了,那麼需要合併的格子數mark就需要重新計算
22                     }
23                }
24          }
25          else {
26                     $('#dg .datagrid-view2 .datagrid-body').html('<div style="margin:10px 0; text-align:center;">沒有記錄.</div>'); //沒有記錄.
27          }
28      }
29 }
View Code

 

 效果圖:

 

 

3. 行內編輯及按鈕關鍵點:

  • 待編輯列需要新增editor屬性,並且指定編輯時為何控制元件(type:'combotree'/'combobox'/'text')並指定相關屬性(options)
  • 增加方法onBeginEdit和onEndEdit,可用於初始化編輯控制元件以及賦值
  • 增加toolbar屬性,新增編輯按鈕
 1         //初始化模版表格
 2         function initdgstate() {//[StateID],[CenterID],[StateCode],[StateName],[SNLength],[SNType] 
 3             $('#dg').datagrid({
 4                 width: $(window).width() - 20,
 5                 height: $(window).height() - 100,
 6                 url: 'State.aspx',
 7                 singleSelect: true,
 8                 rownumbers: true,
 9                 onClickRow: function (rowIndex, row) {
10                     selectRow(rowIndex, row, $("#dg"));
11                 },
12                 onDblClickRow: function () {
13                     //雙擊選中
14                     fchangeRow();
15                 },
16                 onBeginEdit: function (rowIndex, row) {
17                     var ed = $(this).datagrid('getEditor', { index: rowIndex, field: 'CenterName' });
18                     var st = $(this).datagrid('getEditor', { index: rowIndex, field: 'STStateName' });
19                     var ft = $(this).datagrid('getEditor', { index: rowIndex, field: 'FTStateName' });
20                     var pstate = $(this).datagrid('getEditor', { index: rowIndex, field: 'PStateName' });
21 
22                     //-----------------初始化獲得combotree值------------------
23                     $(pstate.target).combotree({
24                         url: 'State.aspx?ajax=getState&cid=' + G("selcenterid").value,
25                         methord: 'get',
26                         onBeforeExpand: function (record) {
27                             $(pstate.target).combotree("tree").tree("options").url = "State.aspx?ajax=getState&cid=" + G("selcenterid").value + "&pid=" + record.id;
28                         },
29                         onSelect: function (record) {
30                             row.PID = record.id;
31                         },
32                         onShowPanel: function () {
33                             if (($(pstate.target).combotree('tree').tree('getRoots').length) == 0) {
34                                 $(pstate.target).combotree('setValue', "");
35                                 row.PID = 0;
36                             }
37                         }
38                     });
39                     if ($(pstate.target).combotree('getValue').length == 0) {
40                         $(pstate.target).combotree('setValue', row.PStateName);
41                     }
42                 },
43                 onEndEdit: function (rowIndex, row) {
44                     //--------------選擇combotree結果--------------
45                     var pid = $(this).datagrid('getEditor', { index: rowIndex, field: 'PStateName' });
46                     row.PStateName = $(pid.target).combotree('getText');
47                 },
48                 columns: [[
49                     { field: 'StateID', width: 60, align: 'center', title: '狀態編號' },
50                     { field: 'CenterID', width: 100, halign: 'center', title: 'ID', hidden: true },
51                     { field: 'CenterName', width: 120, align: 'center', title: '利潤中心 *', editor: 'text' },
52                     { field: 'StateName', width: 120, align: 'center', title: '狀態名稱  *', editor: 'text' },
53                     { field: 'StateCode', width: 100, align: 'center', title: '程式碼  *', editor: 'text' },
54                     { field: 'SNLength', width: 90, align: 'center', title: '流水號長度  *', formatter: formateNum, editor: { type: 'numberbox', options: { precision: 0 } } },
55                     {
56                         field: 'SNType', width: 90, align: 'center', title: '流水號型別  *',
57                         formatter: formateType,
58                         editor: {
59                             type: 'combobox',
60                             options: {
61                                 valueField: 'id',
62                                 textField: 'text',
63                                 data: [{ id: "1", text: "天" }, { id: "2", text: "月" }],
64                                 panelHeight: 'auto',
65                                 editable: false
66                             }
67                         }
68                     },
69                     { field: 'PID', width: 100, halign: 'center', title: 'PID', hidden: true },
70                     {
71                         field: 'PStateName', width: 120, align: 'center', title: '上級狀態',
72                         editor: {
73                             type: 'combotree',
74                             options: {
75                                 valueField: 'id',
76                                 textField: 'text',
77                                 panelHeight: 'auto',
78                                 editable: false
79                             }
80                         }
81                     }
82                 ]],
83                 toolbar: [
84                     { id: 'addBtn', text: '新增', iconCls: 'icon-add', handler: faddRow }, '-',
85                     { id: 'editBtn', text: '修改', iconCls: 'icon-edit', handler: feditRow }, '-',
86                     { id: 'delBtn', text: '刪除', iconCls: 'icon-remove', handler: fdelRow }, '-',
87                     { id: 'saveBtn', text: '儲存', iconCls: 'icon-save', handler: fsaveRow }, '-',
88                     { id: 'cancelBtn', text: '取消', iconCls: 'icon-cancel', handler: fcancelRow }, '-',
89                     { id: 'changeBtn', text: '選擇', iconCls: 'icon-ok', handler: fchangeRow }]
90             });
91         }
92         //格式化
93         function formateNum(val, row) {
94             if (val != undefined) {
95                 return formatNumber(val, "#.##");
96             }
97         }
View Code

  效果圖: