2

したがって、現在のアプリでは、jqGrid のいくつかの行でカスタム Formatter を使用する必要があります。これらはすべて、私の ajax 呼び出しからいくつかのフィールドを取得し、それらを 1 つに連結して、それを行に配置するだけです。

EG ( data.toStreet + data.toCity + data.toState + data.toZip ) は、"Street City, State Zip" として "To Address" 列に返されます。これは正常に機能し、データは正しく表示されますが、フィルター ツールバーを使用すると、フィルターは最初の値 (data.street) のみに基づいています。以下は、問題のコード部分の非常に単純化されたバージョンです。

$('#grid').jqGrid({
...
colNames:["AddressTo", "AddressFrom"],
colModel:[
     {name:"toStreet" formatter: ToAddressFormatter},
     {name:"fromStreet" formatter: FromAddressFormatter}
],
...
}),
 $('#grid').jqGrid('filterToolbar',
    {
        stringResult:true,
        searchOnenter: true,
        defaultSearch: 'cn'
    }
 });
ToAddressFormatter = function(el, opt, rowObj){
    var address = rowObj.toStreet+ " " + rowObj.toCity + ", " + rowObj.toState + " " + rowObj.toZip;
    return address;
},
FromAddressFormatter = function(el, opt, rowObj){
    var address = rowObj.fromStreet+ " " + rowObj.fromCity + ", " + rowObj.fromState + "  " + rowObj.fromZip;
    return address;
}

そのため、セル内の値がフォーマット後に「123 fake st, springfield, Va 22344」と表示されている場合、フィルター ツールバーは「123 fake st」のみを検索でき、それ以外は何も検索できません。これを修正する方法、またはおそらくなぜそれが起こっているのか、そして良い回避策についての手がかりはありますか??

編集:グリッドの先頭を含めました。また、result.d のプロパティ Address は以下のコードで作成され、Web サービスからは返されません。私の列は「住所」にマップされており、書式設定は適切に表示されますが、意図したとおりに検索されません。

 $('#grdDisasters').jqGrid({
                datatype: function(postdata) {
                    var obj = { "showActive": $('#btnFilterActive.pressed').length > 0 ? true : false, "showInactive": $('#btnFilterActive.pressed').length > 0 ? true : false,
                        'page': postdata.page, 'rows': postdata.rows, 'sortIndex': postdata.sidx, 'sortDirection': postdata.sord, 'search': postdata._search,
                        'filters': postdata.filters || ''
                    };
                    $.ajax({
                        url: "/GetGrid",
                        data: JSON.stringify(obj),
                        success: function(result) {
                            for (var i = 0, il = result.d.rows.length; i < il; i++) {
                                LoadedDisasters[i] = result.d.rows[i];
                                result.d.rows[i].cells.Address = result.d.rows[i].cells.Street + " " + result.d.rows[i].cells.City + ", "+ result.d.rows[i].cells.State+ " "+ result.d.rows[i].cells.Zip;
                            }
                            result.d = NET.format(result.d);//just correctly format dates
                            UpdateJQGridData($('#grdDisasters'), result.d);
                        },
                        error: function(result) {
                            //alert("Test failed");
                        }
                    });
4

2 に答える 2

2

カスタム/事前定義されたフォーマッタを使用してデータがフォーマットされている場合、jqGrid では行のフィルタリングに問題があります。

サーバー側で行をフィルタリングする必要があります。

jqgrid 検索リクエストを処理するために、コントローラにさらに 2 つのリクエスト パラメータを追加します。

jqGrid がフィルタリングされた raw を要求すると、パラメーター: _searchwith value:が追加され、ユーザーが名前付きの列と値付きの列をそれぞれ使用してフィルター処理することを意味するtrue ようなすべての検索パラメーターが追加されます。col1=abc&col4=123col1col4abc123

これらの値を使用して、次のような操作でデータベースにクエリを実行します。

select id, concat(street1, street2, city, state, zip) as address 
 where address like "%abc%" and id like "%123%"

これらの行を json として jqGrid に返し、現在のページに表示します。したがって、基本的には、サーバー側のページング、並べ替え、および検索を備えた jqGrid が必要になります。クライアント側のページング、並べ替え、および検索機能は使用できません。また、設定していないことを確認してくださいloadonce: true

于 2012-04-11T18:33:59.037 に答える
2

間違った方法でグリッドを埋めていると思います。ソース データに toStreet、toCity、toState、toZip、fromStreet、fromCity、fromState、fromZip プロパティがあり、合成する必要がある場合は、別の方法でこれを行う必要がaddressToあります。addressFromあなたの問題は、サーバーから取得したように、内部パラメーターに元の形式toStreetでローカルに保存されることです。ローカル検索はパラメーターを使用するため、サーバーから取得したなどのが使用されます。fromStreetdatadatatoStreetfromStreet

あなたが使用しているjqGridの完全なコードを投稿していません。したがってdatatype: 'json'、 、datatype: 'jsonp'またはdatatype: 'xml'と組み合わせて使用​​すると思いますloadonce: true。定義する必要がありますcolModel

$('#grid').jqGrid({
    ...
    colNames:["AddressTo", "AddressFrom"],
    colModel:[
        {name: "addressTo", ...},
        {name: "addressFrom", ...}
    ],
    beforeProcessing: function (data) {
        var i, rows = data.rows, l = rows.length, item;
        for (i = 0; i < l; i++) {
            item = rows[i];
            item.addressTo = item.toStreet + " " + item.toCity + ", " +
                item.toState + " " + item.toZip;
            item.addressFrom = item.fromStreet+ " " + item.fromCity + ", " +
                item.fromState + "  " + item.fromZip;
        }
    }
    ...
});

正確なコードは、入力データの形式によって異なります。を使用する利点は、データが jqGrid によって処理されるbeforeProcessingに呼び出されることです。したがって、上記のように、データの変更などを行うことができます。

更新: のコードは、datatype標準の jqGrid オプションを使用して別の方法で簡単に実装できます。したがって、次の設定を使用することをお勧めします。

datatype: "json",
url: "/GetGrid",
postData: {
    // add and to the list of parameters sent to the web service
    showActive: function () {
        return $('#btnFilterActive.pressed').length > 0;
    },
    showInactive: function () {
        return $('#btnFilterActive.pressed').length > 0;
    }
},
prmNames: {
    // rename some parameters sent to the web service
    sort: "sortIndex",
    order: "sortDirection",
    search: "search",
    // don't send nd parameter to the server
    nd: null
    // you leave the nd is you don't set any "Cache-Control" HTTP header
    // I would recommend you to set "Cache-Control: private, max-age=0"
    // For example
    // HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0));
},
serializeGridData: function (postData) {
    // control modification of the the data (parameters) which will be sent
    // to the web method
    if (typeof postData.filters === "undefined") {
        postData.filters = "";
    }
    return JSON.stringify(postData);
},
ajaxGridOptions: { contentType: "application/json" },
jsonReader: {
    root: "d.rows",
    page: function (obj) { return obj.d.page; },
    total: function (obj) { return obj.d.total; },
    records: function (obj) { return obj.d.rows.length; },
    repeatitems: false
},
loadError: function (jqXHR, textStatus, errorThrown) {
    // see an implementation example in the answers
    // https://stackoverflow.com/a/6969114/315935
    // and
    // https://stackoverflow.com/a/5501644/315935
},
colNames:["AddressTo", "AddressFrom"],
colModel:[
    {name: "addressTo", ...},
    {name: "addressFrom", ...}
],
beforeProcessing: function (data) {
    var i, rows, l, item;

    data.d = NET.format(data.d); // just correctly format dates
    rows = data.d.rows;
    l = rows.length;
    for (i = 0; i < l; i++) {
        item = rows[i];
        LoadedDisasters[i] = item;
        item.addressTo = item.toStreet + " " + item.toCity + ", " +
            item.toState + " " + item.toZip;
        item.addressFrom = item.fromStreet+ " " + item.fromCity + ", " +
            item.fromState + "  " + item.fromZip;
    }
}
...

answernd: nullで説明した「Cache-Control: private, max-age=0」の設定での使用法。これを使用する対応するデモ プロジェクトをダウンロードできます。一般に、呼び出す場所に1行追加するだけで済みますSetMaxAge

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public MyGridData GetGrid(...) {
    HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0));
    ...
}

ここで読むことができるキャッシュ制御の詳細を参照してください。

于 2012-04-11T21:41:32.737 に答える