【问题标题】:jqGrid always highlighting first row when using addRowData使用 addRowData 时 jqGrid 始终突出显示第一行
【发布时间】:2011-08-16 13:06:50
【问题描述】:

一直试图获取 rowID 无济于事,我突然意识到我的代码中有一个错误影响了 jqGrid 的运行方式。

我的代码如下:

function showSearchResults(k1,k2,k3,k4,k5){

jQuery("#list2").jqGrid(    {   datatype: function(pdata) {
        getData(pdata,k1,k2,k3,k4,k5);
    },
                            colNames:['title','section','Year','Month', 'Page', 'rank', k1,k2,k3,k4,k5],
                            colModel:[
                                        {name:'title',index:'title', width:300},
                                        {name:'section',index:'section', width:100},                                    
                                        {name:'yearEdition',index:'yearEdition', width:60, align:"center"},
                                        {name:'monthEdition',index:'monthEdition', width:60, align:"center"},
                                        {name:'pageNumber',index:'pageNumber', width:60, align:"center"},
                                        {name:'rank',index:'rank', width:100, align:"center"},
                                        {name:'keyword1',index:'keyword1', width:100, align:"center"},
                                        {name:'keyword2',index:'keyword2', width:100, align:"center"},
                                        {name:'keyword3',index:'keyword3', width:100,align:"center"},
                                        {name:'keyword4',index:'keyword4', width:100,align:"center"},
                                        {name:'keyword5',index:'keyword5', width:100,align:"center"}
                                    ],
                            rowNum:10,
                            rowList:[10,20,30],
                            pager: '#pager2',
                            sortname: 'id',
                            viewrecords: true,
                            sortorder: "desc",
                            loadonce:true,
                            caption:"Results" });

jQuery("#list2").jqGrid('navGrid','#pager2',{edit:false,add:false,del:false});

GetData 函数只是这样的:

function getData(pdata,keyword1,keyword2,keyword3,keyword4,keyword5) {

$.getJSON('addresshere?callback=?',
    {
        k1:keyword1,
        k2:keyword2,
        k3:keyword3,
        k4:keyword4,
        k5:keyword5,
        async:false
    },

    function (data) {
    var a = JSON.parse(data);

    if (a.length != 0)  {
        $.each(a, function (index, item)
                        {
                        var thegrid = jQuery("#list2"); 
                        thegrid.addRowData(0,item);
                        });
                        }
                    });
    }

从 WebService 返回行,填充网格都可以正常工作,但无论我在哪里单击网格,第一行总是突出显示。

是否有任何明显或已知的问题(如字段名称与 jsGrid 代码冲突等)。

【问题讨论】:

    标签: javascript jquery ajax jqgrid


    【解决方案1】:

    是的,当你说:

    thegrid.addRowData(0,item);
    

    您正在为网格中的每一行分配相同的 ID 0。

    来自addRowData 的文档:

    参数

    • 行标识
    • 数据
    • 位置
    • srcrowid

    说明

    插入一个 id = rowid 的新行,其中包含 data (对象)中指定位置的数据(表中的第一个,表中的最后一个或在 srcrowid 中指定的行之前或之后)...

    此方法可以一次插入多行。在这种情况下,数据参数应该是数组定义为 [{name1:value1,name2: value2…}, {name1:value1,name2: value2…} ] 和第一个选项 rowid 应该包含数据对象的名称,该名称应该作为行的 id。在这种情况下,rowid 的名称不必是 colModel 的一部分。

    由于您一次插入一行(而不是如上所述的多行),因此您需要在调用addRowData 时为每一行分配一个唯一的 ID。我建议您在 Web 请求中检索唯一 ID,并根据需要重构代码以分配 ID:

     thegrid.addRowData(item.id, item);
    

    如果您在后端没有唯一 ID,这显然是一个问题 - 尽管这可能表明存在更大的设计问题。无论如何,如果您无法检索 ID 变量,我建议您使用临时 JavaScript 变量为每一行分配一个不断增加的 ID:

    var counter = 0;
    ...
        thegrid.addRowData(counter, item);
        counter++;
    ...
    


    更新

    正如 Oleg 指出的,您还可以将 undefined 作为 ID 传递,以允许 jqGrid 自动生成唯一 ID。您可以从 grid.base.js 中源代码的相关部分看到这一点:

    if(typeof(rowid) != 'undefined') { rowid = rowid+"";}
    else {
        rowid = $.jgrid.randId();
        ...
    

    我没有在文档中看到此功能,因此使用它需要您自担风险。不过话虽如此,这似乎是一个不错的功能,估计 jqGrid 团队没有理由删除。

    【讨论】:

    • 顺便说一句,如果使用undefined``as the first parameter of addRowData`,则将针对$.jgrid.randId()生成行的ID。
    • @Oleg - 很酷,感谢您指出这一点!但我担心这不是文档 wiki 的一部分。大概 jqGrid 的未来版本将保留此功能?你认为这应该添加到文档中吗?
    • 我犯了多么愚蠢的错误,感谢您的帮助,非常感谢,我现在可以确认作品完美无缺。再次感谢。
    • @Justin:你是对的,应该在文档中包含该行为。 $.jgrid.randId 函数本身尚未记录。在我的建议here 之后,它被包含在当前的减少中。该函数从 jqGrid 4.0.0 开始存在。我确信addRowData 的行为不会改变。顺便说一句,一个addRowData 调用可以添加许多行
    • @Oleg - 感谢您的澄清和 jqGrid 代码:)。既然你是对的,我已经用多行的文档更新了我的答案,这是addRowData 的另一个有效用法。
    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2012-03-03
    • 2011-08-05
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多