1

以下のように定義された jqGrid Treegrid があります。

$('#MyGrid').jqGrid({
    colNames: ['Id','Nome','Nivel','Combo',''],
    colModel: [
        { hidden: true, name: 'Id' },
        { editable: true, name: 'Nome' },
        { hidden: true, name: 'Nivel' },
        { name: 'Combo', editable: true, edittype: 'select',
            editoptions: {
                buildSelect: createSelectList ,
                dataUrl: '/Home/GetCombo' // <-- to this controller, I want
                    // to send the id of the row edited to load custom items
                    // in select object
            }}, 
        { formatter: 'actions', formatoptions: { keys: true },
            resizable: false, search: false, sortable: false,
            width: 60, viewable: false, name: 'actions' }
    ],
    cellEdit: true,
    url: '...',
    datatype: 'json',
    editurl: '...',
    jsonReader: {
        repeatitems: false,
        id: 'Id',
        subgrid: { repeatitems: false }
    }, 
    mtype: 'POST',
    gridComplete: function() { myOnGridComplete(); },
    ajaxSelectOptions: {
        data: {
            tempid: function () {
                // !!! the next line always returns null
                return $('#MyGrid').jqGrid('getGridParam', 'selrow');
            }
        }
    }, 
    prmNames: { npage: 'npage' }, 
    rowNum: -1,
    ExpandColClick: true,
    ExpandColumn: 'Nome',
    treeGrid: true,
    treeGridModel: 'adjacency',
    width: 700,
    height: '100%'
});

私の目標は、現在の行 ID をサーバーに送信することですが、$('#MyGrid').jqGrid('getGridParam', 'selrow')を使用すると、常に null 値が返されます。

私はすでにこの投稿を読みましたが、どれも私の問題を解決しません:

何か提案はありますか?

事前に!

更新 1:

TreeGrid バインドは問題ありません。本当の問題は、リーフ ノードの [編集] ボタンをクリックしたときです。このイベントでは、追加のデータをサーバーに送信したいと考えています。

を使用してこれを達成しようとしましたajaxSelectOptionsが、このコマンドは常に null を返します。$('#MyGrid').jqGrid('getGridParam', 'selrow')

回避策

これは、オレグの助けを借りる前に私が行った回避策です。

ステップ 1: HTML に隠しフィールドを作成する

ステップ 2: myOnGridComplete 関数で、クリック イベントを編集ボタンに設定します。

function onGridAjusteDTOComplete()
{
    $('#MyGrid').find('span.ui-icon-pencil').each(function() {
        $(this).click(function(){
            var rowID = $(this).parents('tr').attr('id');
            // !!! the next commented line not work in my case
            // $('#MyGrid').jqGrid('setSelection', therowid );
            $('#myHiddenField').val(rowID); // <-- this works
        });
    });
}

ステップ 3:rowIDの隠しフィールドから を取得しajaxSelectOptionsます。

ajaxSelectOptions: "{type: 'GET', contentType: 'application/json; charset=utf-8',dataType: 'json',cache: false, async:false, data: {id: function () { return $('#myHiddenField').val(); }}}"

解決

以下の Oleg が提供するソリューションを参照してください。それはただ素晴らしいです。オレグありがとう。

4

1 に答える 1

0

あなたの問題を正しく理解しているかどうか確信が持てません。TreeGridは、子ノードのロード中に親ノードの ID を自動的に送信します。サーバーに送信される、、パラメータに関するドキュメントを参照してください。そのため、現在選択されている行の ID ( ) をさらにサーバーに送信する必要がある理由がわかりません。nodeidparentidn_levelselrow

更新: 今、私はあなたが説明した問題の理由を理解しています. 他の人がいる可能性があるのは本当に興味深い問題です。

本当の解決策は、 jqGrid のコードを変更して、 call which builddataで使用されるパラメーターを構築できるコールバック関数をサポートすることです。jqGrid の元のコードの最も簡単な変更は、次の行を挿入することです。$.ajax<select>

var rowid = $.jgrid.stripPref($t.p.idPrefix,
        String(options.id).substring(0, String(options.id).length - String(options.name).length - 1));

withが呼び出されるコード行の。さらに、次のパラメータにもう 1 つパラメータを追加する必要があります。$.ajaxdataUrl$.ajax

data: $.isFunction(ajaxso.postData) ?
    ajaxso.postData.call($t, rowid, String(options.name), vl) :
    ajaxso.postData,

そのような変更の後、使用できるようになります

ajaxSelectOptions: {
    postData: function (rowid, colName, value) {
        return { id: rowid };
    }
}

デモは、アプローチが機能することを示しています。Fiddler、Firebug、または開発者ツールで、オプションidが実際に URL に送信されることを確認できます。後でtrirandに対応する提案を投稿します(より一般的なケースに対していくつかの追加の改善を行いたいです)

現在のバージョンの jqGrid でソリューションを実装する必要がある場合は、代わりに次の手順を実行できます。リクエスト$.jgrid.createElを行うメソッドを「サブクラス化」できます。$.ajax実装も十分に単純です。

var originalCreateEl = $.jgrid.createEl,
    createElementOptions;

$.extend($.jgrid, {
    createEl: function (eltype, options, vl, autowidth, ajaxso) {
        if (options.dataUrl) {
            createElementOptions = options;
        }
        return originalCreateEl.call(this,eltype, ptions,vl,autowidth,ajaxso);
    }
});

$('#MyGrid').jqGrid({
    ...
    ajaxSelectOptions: {
        data: {
            id: function () {
                var id = createElementOptions.id,
                    colName = createElementOptions.name;
                if (typeof id !== "string" || typeof colName !== "string") {
                    return null;
                }
                return id.substring(0, id.length - colName.length - 1);
            }
        }
    }
});

次のデモでは、その方法を示します。

UPDATED 2 : ajaxSelectOptions`のプロパティとしてサポートするプル リクエストを投稿しました。リクエストは現在コミットされています (こちらを参照)。そのため、jqGrid の次のバージョン (4.4.1 以降) には、「すぐに使える」機能があります。postData` and

于 2012-12-17T12:01:28.893 に答える