2

誰かがasp.net+asmx +jqGridの並べ替えでこの厄介な問題を解決する方法を知っていますか?jqGridからpagemethodsまたはasmxWebサービスを呼び出すには、次のようにハッキングする必要があるためです。

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;
                        }

これの代わりに:

datatype: "json"

そのため、クライアントで並べ替えを行うためにloadonce属性をtrueに設定しても機能せず、jqGridはグリッドで発生するすべてのイベントに対してサーバーを呼び出します。

何か案は?

サンクスマルコ

4

4 に答える 4

7

少し遅れていますが、将来のソリューションを求める人のための(?)非常に簡単なソリューションは次のとおりです。

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

それでおしまい。私は3.7.2を使用していますが、他のバージョンについて話すことはできません。この問題は(明らかに)「loadonce」が事前定義されたデータ型の値でのみ機能することに起因しますが、関数はそうではありません。他の組み込み値も機能すると思いますが、「ローカル」は理にかなっています。

于 2010-08-17T15:47:05.597 に答える
2

私は最終的にJSON(ASP.NETを使用)をあきらめ、XMLを使用しました。その後、すべてが正常に機能します。asmxからの戻りタイプがXmlDocumentであることを確認してください

それを機能させるために必要なすべての(少なくともクライアント側で)概要は、JQGridwikiにあります。

サンプルXMLを見て、サービスが同じスキーマに従うバッファー( Fiddlerで検証するのが最適)を返すことを確認します。

更新-いくつかのコードサンプル

グリッドを作成するためのクライアント側のスクリプトは次のとおりです

     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)です:

  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

XMLを文字列として作成し、それをXMLDocumenntにロードしていることがわかります。これが最善の方法だとは言えません。ドキュメント上に直接XMLDOMを構築できます。

于 2009-08-25T19:25:01.357 に答える
2

たくさんのハーレブに感謝します...他の人にとっても1つのヒントとして、クライアントで動作するようにグリッドを設定できます

データ型:'クライアントサイド'

属性。オンラインドキュメントに記載されていないため、最初は見つかりませんでしたが、ここからダウンロードできるPDFドキュメントにあります。

乾杯

于 2009-08-27T16:35:54.627 に答える
0

@Groxxのソリューションが機能しなかった場合(試してみると、列を並べ替えようとするたびにグリッドのコンテンツが消えてしまいました)、このスレッドのソリューションを試してください。それは私のために働いた。jqGrid4.5.4を使用しています。

まず、loadonce : trueグリッドの設定を設定します。ここで説明するように、これにより、グリッドが初めてロードを終了した後、データ型パラメーターが「ローカル」に変更されます。次に、グリッドをリロードする場合は、データ型を次のように戻しますjson

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

使用している場合は、この回答navGridに示されているように、追加、編集、および削除のオプションを確認して、グリッドを強制的に再ロードすることをお勧めします。

于 2014-01-08T16:01:12.017 に答える