【问题标题】:jqgrid inlinenav - custom row id and deletejqgrid inlinenav - 自定义行ID和删除
【发布时间】:2013-06-04 16:12:12
【问题描述】:

每一行在我们的数据库中都有一个与 jqgrid 行 id 不同的 id。保存行时如何发送此 lineid?

另外,有没有办法删除一行?

这是我目前的代码:

var mydata = [

              {
                        lineItemId: "785",
                productSku:"n123",
                productName:"hello there",
                pieces:"123",
                value:"23.00",
                line:"123"
              }
              ,
              {
                        lineItemId: "803",
                productSku:"n1234",
                productName:"hello there",
                pieces:"123",
                value:"23.00",
                line:"123"
              }               
            ];    

var colNames = ['SKU','Product Name', 'Pieces','Total Value','Line Number'];

var colModel = [
  {name:'productSku', index:'productSku', width:10, sorttype: 'text', editable:true},
  {name:'productName', index:'productName', width:60, editable:true},
  {name:'pieces', index:'pieces', width:10, sorttype: 'int', editable:true, formatter: 'integer'},
  {name:'value', index:'value', width:10, sorttype: 'int', editable:true, formatter: 'number'},
  {name:'line', index:'line', width:10, sorttype: 'int', editable:true, formatter: 'integer', formatoptions:{thousandsSeparator: ""}}
          ];

initOrdersJqGrid("orderContent", mydata, '<xsl:value-of select="$datapath/OrderId"/>', colNames, colModel, "sku", "desc");

var orderLineOptions = {
          keys: true,
          aftersavefunc: function (rowid, response, options) {
            // only update page if orderis is nil i.e. a new order
            if($('#orderidlabel').text() == "") {
              log('saving order line item from order with no id yet.');
              var dummy = $('<div />').html(response.responseText);
              var id = dummy.find('#orderId').val();
              $('#orderidlabel').text(id);
              $('#orderId').val(id);
              $('button[value="Save Order"]').trigger('click');
            }
          }
        }

    function initOrdersJqGrid(id, data, orderid, colNames, colModel, defaultSortColumn, defaultSortOrder) {
        $("#" + id + "Table")
        .jqGrid({
        datatype: "local",
        data: data,
        colNames: colNames,
        colModel: colModel,
        localReader: { id: "lineItemId"},
        pager: '#' + id + 'Pager',
        autowidth: true,
        gridview: true,
        autoencode: true,
        height: "auto",
        forceFit: true,
        shrinkToFit: true,  //Width of columns should be expressed in integers which add to 100
        sortname: defaultSortColumn,
        sortorder: defaultSortOrder,
        url: "fs/servlet/CS",
        editurl: "CS?action=com.agistix.webinterface.controllers.OrderIC,saveLineItems&orderId=" + orderid
      })
      .jqGrid('navGrid',"#" + id + "Pager",{edit:false,add:false,del:false,search: false, refresh: false})
      .jqGrid('inlineNav',"#" + id + "Pager", { addParams: { addRowParams: orderLineOptions }, editParams: orderLineOptions});

    }

【问题讨论】:

  • rowid 问题的原因通常是网格中的数据填充错误。您能否将colModel 与作为本机数据库ID 的列的描述一起使用?您能否包括您使用的data 的示例(一行就足够了)?奇怪的是你用datatype: "local"和数据库返回的数据。
  • 嗨@Oleg,我已经用更多代码更新了这个问题。我想为每一行使用的 id 在 xml 中返回:
  • 抱歉,您为mydata 发布了绝对错误的数据。甚至 JavaScript 片段的语法也是错误的。如果您使用 XSL 生成数据,您应该发布 resulting 数据。此外,colModel 不包含任何列的key: true。所以你应该在数据id属性中包含来自数据库的id值(例如来自LineItemId的值)。
  • 我更新了代码 sn-p 以显示生成的 mydata 数据。我相信语法是正确的并且有效。
  • @Oleg - 如果您能举例说明如何为每一行使用数据库中的 id,我将不胜感激。 jqgrid 的文档似乎很难理解。

标签: jqgrid jqgrid-inlinenav


【解决方案1】:

如果你使用datatype: "local",那么data参数指定的输入数据数组中的项目应该有additional属性id,它指定每一行的id属性的值(&lt;tr&gt;) 的网格。如果您希望使用其他名称的 rowid 属性,您可以使用 localReader 来指定它。例如localReader: { id: "Id" } 选项通知 jqGrid 从Id 属性中获取行(rowids)的id 属性的值。如果您的数据项应该如下所示

{
    Id: 76453
    productSku:"n123",
    productName:"hello there",
    pieces:"123",
    value:"23.00",
    line:"123"
}

id 属性的值必须是唯一的。

如果您在网格中已经有一些列包含来自某个数据库表的 id,则不需要使用 id 属性添加相同的值。取而代之的是,您可以在列中使用key: true。 jqGrid 允许将key: true 放置在colModel一个 项中。

了解行 ID 的另一个常见问题很重要。如果您需要在页面上放置多个作为一个网格,或者如果您需要将子网格用作网格,那么您仍然会遇到一个问题。数据库中的 id 在一个table 中是唯一的,但在多个表中可以有相同的 id。另一方面,HTML 元素的 ID(包括用于行的 &lt;tr&gt; 元素)在整个页面中必须是唯一的

为了解决这个问题,可以使用 jqGrid 的idPrefix 选项。例如,您在数据库中有INT IDENTITY 列作为数据库中表的主键。在这种情况下,您将拥有整数作为 rowids 的本机 id。例如,第一个网格中的值可以是 3540。通过使用idPrefix: "g1_",分配给行(到&lt;tr&gt; 元素)的ID 将是"g1_3""g1_5""g1_40"。因此,在第一个网格中使用 idPrefix: "g1_" 和像 idPrefix: "g2_" 这样的另一个值可以解决潜在的 id 重复问题。如果 jqGrid 将一些数据发送到服务器(例如,如果您在网格中使用编辑),那么 jqGrid 会自动从 rowid 中去除前缀​​ idPrefix ,这一点很重要。可以区分“id”和“rowid”名称。 “rowids”总是带有前缀。您可以使用$.jgrid.stripPref 函数来剪切前缀。

【讨论】:

  • 谢谢奥列格。它可以将 id 添加到数据对象。现在我需要通过 id 作为“lineItemId”发送。我尝试添加 localReader(请参阅上面的更新代码),但它仍然发布为“id”
  • @MarkSteggles:不客气!如果我正确理解您的需求,您应该使用 jqGrid 的 prmNames: {id: "lineItemId"} 选项。
猜你喜欢
  • 2014-05-28
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多