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') 时,我总是得到一个空值。

我已经阅读了这篇文章,但没有一个能解决我的问题:

有什么建议吗?

提前谢谢!

更新1:

TreeGrid 绑定没问题。真正的问题是当我单击叶节点中的编辑按钮时。在这种情况下,我想向服务器发送额外的数据。

我尝试使用 来完成此操作ajaxSelectOptions,但此命令始终返回 null:$('#MyGrid').jqGrid('getGridParam', 'selrow')

解决方法

这是我在 Oleg 帮助之前所做的一种解决方法:

第 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 的代码以支持一些回调函数,该函数可以构造调用 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的代码行之前。此外,还需要在 中添加一个参数:$.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);
            }
        }
    }
});

下一个演示演示了该方法。

更新 2:我发布了拉取请求以支持ajaxSelectOptions的postDataas 属性。` and现在提交请求(请参阅此处)。所以 jqGrid 的下一个版本(4.4.1 更高版本)将具有“开箱即用”的功能。

于 2012-12-17T12:01:28.893 回答