[jqGrid]實作第一個jqGrid

如何建置自己第一個jqGrid??

這次實作純粹針對實作jqGrid並記錄,所以會跳過建立MVC專案與如何建立資料的部分。

1. 開發軟體:Visual Studio 2015

2. 資料來源:Visual Studio 2015 LocalDB,使用EntityFramework取得資料

3. 準備:(都可以在NuGet下載,至於版本都載最新的)

  • jquery
  • jquery-ui
  • jqGrid

4. 準備資料,此資料來源為LINE Rangers 手冊,此資料僅限運用在測試 jqGrid之用途。

(圖一)

準備好這些必備的工具與套件後,就來實作看看了。

Step1.載入套件

因為_Layout.cshtml的部分Script會放在@RenderBody()後才載入,故要特別移到上面,如(圖二)所示,這樣才不會因為沒有載入相關元件,導致grid出不來。

還要特別注意一下,就是Bundle後的套件,跟自己載入的套件,不要重複載入。

(圖二)

在專案中,並不是每一個網頁都會使用到jqGrid,故我並未將套件使用Bundle綁定,在_Layout.cshtml載入,而是透過@section script,在要實作的View中才載入這些元件。
(圖三)     

Step2.建置一個基本的jqGrid

1. 建置一個jqGrid,必須要有一組<table>標籤,以及一個<div>標籤。

jqGrid會將<table>轉換成要呈現的表格,而div會變成分頁的項目,此兩個標籤都要給其id,到後面會使用到。

<table id="myGrid"></table>
<div id="pager"></div>

2. 接著,在畫面一載入的時候,我預設會直接載入資料並呈現在畫面上,所以在View裡,直接在網頁載入時,就將jqGrid的語法套上。各個屬性解釋在程式碼中,要更詳細可以參考最後方的參考連結。

<script type="text/javascript">

    $("#myGrid").jqGrid({                  //將id=myGrid的DOM元件轉換成jqGrid
        url: '/Admin/Ranger/QueryRanger',  //取得資料的URL,這邊我會到controller取得資料
        datatype: 'json',                  //資料回傳的類型,有json,xml...等等
        jsonReader: {                      //jqgrid讀取json的時候,需要配置jsonReader才能讀取。
            repeatitems: false              //預設是true,但是我回傳的json的內容並不會按照順序回傳,故這邊要設定false,讓jsonReader是用搜尋name去塞入對應的值
        },
        mtype: 'GET',                      //ajax的類型,有GET和POST
        colModel: [                        //這個是欄位的屬性,name屬性必須要與後端回傳的欄位名稱相同,另外也可以顯示欄位名稱,樣式等等。
           { name: 'Name', label: '名稱', width: 200 },
           { name: 'Grade', label: '等級' },
           { name: 'Type', label: '類型' },
           { name: 'AttackDistance', label: '攻擊距離', sorttype: 'number' }, //sorttype排序方式使用number類型排序
           { name: 'AttackArea', label: '濺射範圍', sorttype: 'number' },
           { name: 'MovingSpeed', label: '移動速度', sorttype: 'number' },
           { name: 'AttackSpacing', label: '攻擊速度', sorttype: 'number' },
           { name: 'AttackTime', label: '攻擊間隔', sorttype: 'number' },
           { name: 'NormalCD', label: '正常CD', sorttype: 'number' },
           { name: 'MasterDPS', label: '大師DPS', sorttype: 'number' },
           { name: 'MasterDEF', label: '大師防禦', sorttype: 'number' },
           { name: 'MasterHP', label: '大師體力', sorttype: 'number' },
           { name: 'Mine', label: '礦', width: '110', sorttype: 'number' }
        ],
        pager: '#pager',                 //這是對應到<div>的id,會透過<div>變成分頁的相關UI
        width: '1000',                   //jqGrid的寬度
        height: 'auto',                  //jqGrid的高度
        rowNum: 10,                      //jqGrid預設顯示筆數
        rowList: [5, 10, 20, 50],        //jqGrid可選擇每頁顯示幾筆
        sortname: 'Name',                //jqGrid預設排序欄位名稱
        sortorder: "asc",                //jqGrid預設排序方式asc升冪,desc降冪
        viewrecords: true,               //是否要顯示總筆數
        caption: 'Ranger清單',           //jqGrid標題欄顯示的文字
        loadonce: true                   //是否只載入一次
    });

</script>

這邊特別說明一下loadonce屬性,若這個設成false,而分頁又沒有自己控制的話,那麼分頁就無法使用了

以這個範例呈現的內容,是撈取整個資料表的資料,若自己有作分頁控制邏輯的話,每次按分頁都會在進入倒controller撈取資料, 對於資料庫來說,這可能會對效能不太好。

這邊設定成true的話,一開始會先去資料庫撈取一次,之後整份資料就會前端,分頁也會透過jqGrid自行處理,這時不論是按上下頁或是排序,都不會再進入倒controller在重新撈取資料。

Step3. 到Controller取得資料

因為我的資料來自於資料庫,所以我在controller中有寫一個函式去取得資料

// GET: Admin/Ranger/QueryRanger
public JsonResult QueryRanger()
{
    //取得所有資料
    var rangerList = db.RANGER.ToList();

    //組成jqGrid要讀取的資料
    var jsonData = new
    {
        rows = rangerList   //jqGrid呈現在表格中的資料
    };

    //回傳
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

Step4. 成果展現

(圖四)

總結:

這只是一開始基本的寫法,希望可以一邊記錄,一邊幫助到想起步jqGrid但失敗的新手,後面還有很多實用的功能還在學習,像CRUD等功能都可以透過jqGrid實作,子表格、客製化按鈕......等。

如果後期有心得,會在這邊持續記錄。

 

參考資料:

 

 

創用 CC 授權條款
本著作由Chenting Weng製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。
This work by Chenting Weng is licensed under a Creative Commons Attribution 4.0 International License.
Based on a work at https://dotblogs.com.tw/chentingw.

部分文章內容會引用到其他網站的簡介或圖片,若有侵犯到您的著作權,請留言告知,本人會儘快移除。
免責聲明:文章屬個人記事使用,僅供參考,若引用文章造成一切損失,本人不承擔任何責任。如有錯誤,歡迎留言告知。

Part of the content of the article will refer to the profile or picture of other websites.
If there is any infringement of your copyright, please leave a message and let me remove it as soon as possible.
Disclaimer:The article is for personal use and is for reference only. I will not bear any responsibility for any loss caused by quoting the article. If there is an error, please leave a message to inform.