2009-08-25 10 views
2

asp.net + asmx + jqGridソートでこの厄介な問題を解決する方法を知っていますか? jqGridからpagemethodsやASMX Webサービスを呼び出すために、それはこのようにハッキングされる必要があり、ので:trueにloadonce属性を設定し、そのためjqGrid loadonce asp.net

datatype: "json" 

:これに代えて

datatype: function() { 
        $.ajax({ 
         url: 'Default.aspx/GetPersons', 
         data: "{}", 
         type: "POST", 
         dataFilter: function(data) { 
          var msg = eval('(' + data + ')'); 
          if (msg.hasOwnProperty('d')) 
           return msg.d; 
          else 
           return msg; 
         } 

クライアント上でソートを行うためには動作せず、jqGridはグリッド内で発生するすべてのイベントに対してサーバーを呼び出します。

アイデア?

ありがとう マルコ

答えて

2

私は最終的には(ASP.NETで)JSONをあきらめ、ちょうどXMLを使用。それですべてがうまくいく。あなたのASMXからの戻り値の型は、常にXmlDocument

あなたはそれが(少なくともクライアント側で)動作させるために行うために必要なすべての良い要約であることを確認してください でJQGrid wiki

ルックで見つけることができます彼らのXMLをサンプルして、同じスキーマに従うバッファ(Fiddlerで検証するのが最善)を返します。あなたは

Public Function getCallsGridDataXML() As XmlDocument 
    Dim xmlRet As New XmlDocument 
    Dim ret As New StringBuilder 

    m_pageNum = CInt(HttpContext.Current.Request.Form.Item("page")) 
    If m_pageNum = Nothing OrElse m_pageNum = 0 Then 
     m_pageNum = 1 
    End If 
    m_pageSize = CInt(HttpContext.Current.Request.Form.Item("rows")) 
    If m_pageSize = Nothing OrElse m_pageSize = 0 Then 
     m_pageSize = 10 
    End If 
    m_sortItem = CStr(HttpContext.Current.Request.Form.Item("sidx")) 
    m_sortOrder = CStr(HttpContext.Current.Request.Form.Item("sord")) 

    Dim dt As DataTable 
    dt = Session(SESSION_CALLS_GRID_DATA) 

    Dim myView As DataView = dt.DefaultView 
    If m_sortItem IsNot Nothing AndAlso m_sortOrder IsNot Nothing Then 
     myView.Sort = m_sortItem & " " & m_sortOrder 
    End If 

    ret.Append("<?xml version='1.0' encoding='utf-8'?>") 
    ret.Append("<rows>") 
    ret.Append("<page>" & m_pageNum & "</page>") 
    ret.Append("<total>" & Math.Floor(dt.Rows.Count/m_pageSize) & "</total>") 
    ret.Append("<records>" & dt.Rows.Count & "</records>") 

    For i As Integer = (m_pageNum - 1) * m_pageSize To Math.Min(dt.Rows.Count - 1, m_pageNum * m_pageSize - 1) 
     ret.Append("<row>") 
     Dim cellCount As Integer = 0 

     ret.Append("<cell>" & Server.HtmlEncode(myView(i)("callId")) & "</cell>") 
     ret.Append("<cell>" & Server.HtmlEncode(myView(i)("callTime")) & "</cell>") 
     ret.Append("<cell>" & Server.HtmlEncode(myView(i)("duration")) & "</cell>") 

     ret.Append("</row>") 
    Next 

    ret.Append("</rows>") 
    xmlRet.LoadXml(ret.ToString) 
    Return xmlRet 
    End Function 

: -

UPDATEいくつかのコードサンプル

ここでは、グリッド

 var mygrid = $("#list").jqGrid({ 
     url: '../../webServices/callsGridService.asmx/getCallsGridDataXML?nd=' + new Date().getTime(), 
     datatype: 'xml', 
     mtype: 'POST', 
     contentType: "text/xml", 
     colNames: ['Call ID', 'Date/Time', 'Duration'], 
     colModel: [ 
     { name: 'callId', index: 'callId', align: "right", key: true }, 
    { name: 'callTime', index: 'callTime', sorttype: 'date' }, 
     { name: 'duration', index: 'duration', align: "right" } 
    ], 
     pager: $('#pager'), 
     rowNum: 10, 
     rowList: [10, 25, 50, 100], 
     sortname: 'callTime', 
     viewrecords: true, 
     sortorder: "desc", 
     height: "100%", 
     multiselect: true, 
     rownumbers: true, 
     gridview: true, 
     autowidth: true, 
     caption: "Calls" 
    }) 

そしてここでサービスコード(VB.NET)であるを作成するには、クライアント側のスクリプトですXMLを文字列として構築してからXMLDocumenntにロードすることができます。これが最善の方法だと私は言うことはできません。 XML DOMをドキュメントに直接ビルドすることができます。 「クライアント側」

属性:ロットharlevありがとう

+0

私はxml-wayを試してみました。確かに... thanx – Marko

+0

xmlを使用しているときにコードの部分を投稿してください... thanx – Marko

2

...また他人1つの先端のために、あなたは

データ型とクライアント上で動作するようにグリッドを設定することができます。オンラインドキュメントには記載されていないので、最初に見つけられませんでしたが、からダウンロードできるpdfドキュメントにあります。

乾杯

+0

はい、PDFが上手くいかないそれまでのところ、それはもっと多くの情報を持っています! –

7

それは少し遅れてですが、ここでは任意の将来のソリューションシーカーのための(?)超簡単なソリューションです:

gridComplete: function(){ 
    $("#yourGridID").setGridParam({datatype: 'local'}); 
} 

それです。私は3.7.2を使用しています、他のバージョンのために話すことはできません。問題は(明らかに) 'loadonce'が、あらかじめ定義されたデータ型の値でしか動作しないことに由来します。 I と他の組み込み値も有効ですが、 'ローカル'は意味があります。

+0

ありがとう!私は関数としてデータ型を持っています。データ型を設定する:gridcompleteでローカル私のために働く! – rsmoorthy

+0

@Groxx:これは私にとっては有効ですが、1つの列に対してのみ有効です。なぜあなたは知っていますか? – DavidS

+0

@DavidS:1つの列に対してのみソートしますか?わからない。もう少し詳しく知っていれば、ちょっと見ることができます:いつも同じ列ですか?同じポジションで?他の人は何もしませんか、それともサーバーにヒットしますか?他の関連性のある設定?そしてどのバージョン?コードは面倒で、バージョンは奇妙な時期に重要です。 – Groxx

0

@ Groxxのソリューションがうまくいきませんでした(グリッドの内容を列でソートしようとするたびに消えてしまいました)、解決策をthis threadから試してみてください。それは私のために働いた。私はjqGrid 4.5.4を使用しています。

まず、グリッドの設定でloadonce : trueと設定します。説明したようにhere、これは、グリッドが最初にロードを終了した後、データ型パラメータを 'local'に変更します。次に、あなたが戻っjsonにグリッド、変更データ型をリロードしたいとき:

$('#your-grid').setGridParam({ datatype : 'json' }).trigger('reloadGrid'); 

あなたがnavGridを使用している場合は、あなたの追加、編集を確認し、this answerに示されているようにリロードするあなたのグリッドを強制するオプションを削除することもできます。