jquery - 在 jqGrid 的 View 模型中添加自定义行

标签 jquery jqgrid

我正在尝试在 View 模型中显示订单的订单详细信息。点击订单并view寻呼机按钮传递 orderID 。使用orderID ,我正在另一个 local json array 中搜索。我正在制作一个包含搜索结果数组值的表,并将其添加为已在 View 模型中使用的行之间的新行,如下图所示。

View Model page with custom row

(从上图中,我着色边框的行是新创建的行。其他行默认由jqGrid创建。)

我与其他行一样创建成功。但是,在单击 View 模型中的“查看下一个或上一个记录”按钮时,它会带来一些麻烦。请参见下图,

View Model with custome Row and repeated data

(不同行的表列值重复附加在单行中)

在此我浏览记录 8次通过下一个 ( #nData ) 和上一个 ( #pData ) 按钮。这样做时,左侧 <td>我的客户行的文本“订单详情”和下一个自动生成的 row's (总计)右侧<td>的文字重复8次。我每次单击下一个或上一个,它都会在我的自定义行之后附加新行。

这是我的代码,

  var myData2 = <?php echo json_encode($oParticularResult) ?>;
  //Here I'm adding custom row
  var showIdRow = function ($form) {
  var $this = $(this),
  rowid = $this.jqGrid("getGridParam", "selrow");
  var addHTML = '<tr class="FormData" id="trv_particulars"><td class="CaptionTD form-view-label ui-widget-content" 

width="30%"><b>Order Particulars</b></td>';
  addHTML += '<td class="DataTD form-view-data ui-helper-reset ui-widget-content" id="v_tot"><span>';
    addHTML += "<table border='2px'><thead><tr><td>Sl.No.</td><td>Particulars 

Name</td><td>Quantity</td><td>Amount</td></tr></thead><tbody>";
    var count = 1;
  for (i in myData2)
  {
  if(myData2[i].orderID == rowid)
  {
     addHTML += "<tr><td>"+count+"</td><td>"+myData2[i].proName+"</td><td>"+myData2[i].proQuantity+"</td><td>"+myData2

[i].proPrice+"</td></tr>";
     count++;
  }
    }
    $(addHTML).insertAfter('#trv_order_dt');
    };
    $(function () {
    var myData = <?php echo json_encode($orderResult) ?>;
  var getCellVal;
  var sel_id;
  $("#orderGrid").jqGrid({
  caption:'Order List',
  datatype:'local',
  data:myData,
  mtype:'POST',
  width:777,
  rowNum:10,
  height:100,
  sortorder:'asc',
  rowList:[10,20,30],
  rownumbers:true,
  viewrecords:true,
  gridview:false,
  autoencode:true,
  loadonce:true,
  pager:'#orderPager',
  sortname:'orderID',

  editurl:'<?php echo $this->action('editStatus'); ?>',
  colNames:['Order Number','Customer Name','Date', 'Total', 'Paid','Balance'],
  //cmTemplate:{editable:true, editrules: {required:true}},
  colModel:[
  { name:'orderID', key:true, width:30 },
  { name: 'custName', index: 'custName', width:60 },
  { name: 'order_dt', index: 'order_dt', width:60 },
  { name: 'tot', index: 'tot', width:60 },
  { name: 'amount', index: 'amount', width:60 },
  { name: 'bal', index: 'bal', width:60 }],
  }).navGrid("#orderPager",
  {add:false, edit:false, view:true, del:false, search:true, refresh:true },
  {},//edit
  {jqModal: true, viewPagerButtons: true, checkOnUpdate:true, savekey: [true,13], navkeys: [false,38,40], checkOnSubmit : 

true, reloadAfterSubmit:false, closeOnEscape:true, closeAfterEdit: true,width:600, height:300}, //add
  {jqModal: true, reloadAfterSubmit:true, closeOnEscape: true,width:600, height:300}, //del
  {jqModal: true, closeAfterSearch: true, closeOnEscape: true, multipleSearch: true, multipleGroup:false, showQuery: true, 

overlay: true, recreateFilter: true,width:600, height:300 }, //search
  {jqModal: true, closeOnEscape: true, width:500,
  recreateForm: true,
  afterclickPgButtons: showIdRow,
  beforeShowForm: showIdRow
  } //view
  );
  });

谁能指出我错过的地方?

我想配置subgrid ,使用我的local data myData2就像上面的情况一样。如果订单ID为myData (主网格的本地 json 数组)和 myData2 (子网格的本地 json 数组)相同,显示那些 myData2下面的记录到父网格行。我认为所有网格都是子网格概念,已经配置得一样。但我找不到任何正确的文档或示例。请提供任何链接以按照上述配置子网格。

解决方案:

我解决了我的问题。每次我们单击该模型中的下一个或上一个按钮时,该 View 模型都会刷新。因为,我用了recreateform:true我正在调用 showIdRowafterclickPgButtonsbeforeShowForm .

我认为它不会将我手动添加的行视为表单值之一。因为在创建表单时,内容是从 myData 加载的。 (本网格数据来源)。因此,当我浏览下一个或上一个按钮时,recreateform正在为其他行工作并且 afterclickPgButtons' and 'beforeShowForm正在调用showIdRow并将新行添加到下面已创建的行中。

因此,我决定删除先前创建的新行,同时追加新行。我已经将自定义行 ID 指定为 trv_particulars 。所以,我像这样使用了我的代码,

.
.
$('#tvr_Particulars').remove();  // remove previously created custome row using row ID
$('#trv_order_dt').after(addHTML);
.
.

现在它在我的场景中工作正常。但@Oleg 在下面answer 中提供了替代和最佳解决方案。 。感谢@Oleg 花时间为我的问题创建另一个可能的解决方案。

最佳答案

我发现你的问题很有趣,所以我创建了 the demo这表明了此类要求的可能实现。 View 的结果如下图所示:

enter image description here

对实现的一些评论。首先,我使用了网格的输入数据,其中包含在 View 中创建“订单详细信息”(“订单详情”)所需的详细信息:

var mydata = [
        { id: "1",  invdate: "2007-10-21", name: "test",   note: "3note",   amount: "200.00", tax: "10.00", closed: true,  ship_via: "TN", total: "210.00",
            subgrid: [{no: "1", amount: "750"}, {no: "2", amount: "750"}, {no: "3", amount: "600"}, {no: "4", amount: "900"}] },
        { id: "2",  invdate: "2007-10-22", name: "test2",  note: "3note2",  amount: "300.00", tax: "20.00", closed: false, ship_via: "FE", total: "320.00",
            subgrid: [{no: "1", amount: "750"}, {no: "2", amount: "600"}, {no: "3", amount: "900"}] },
        ...
    ];

subgrid每个项目的属性都包含信息。

接下来,我在 View 表单的表中插入带有“订单详细信息”(“订单详情”)的自定义行,位于包含“关闭”列信息的行之后。我使用代码

$("#trv_closed").after('<tr class="FormData">' +
    '<td class="CaptionTD form-view-label ui-widget-content" width="40%"><b>Order Particulars</b></td>' +
    '<td class="DataTD form-view-data ui-helper-reset ui-widget-content"><div style="width:100%;height:100%">' +
    '<table id="mysubgrid"><tr><td>' +
    '</td></tr></table>' +
    '</div></td></tr>');

在行"#trv_closed"之后添加行(行的 id 将根据“关闭”列的名称构造)。

然后可以通过不同的方式获取当前显示行的rowid。第一种方法是获取当前选定的行 $this.jqGrid("getGridParam", "selrow") 。另一种方法:可以从包含 <input> 的隐藏列中获取信息。具有 rowid 的元素。可以解决<input>元素由id="id_g" ( $("#id_g").val() ) 或通过 name="id" ($form.find("input[name=id]").val())。我用$("#id_g").val()在我的代码中。

现在可以获得subgrid使用 getLocalRow 选定行的属性(因为我们使用 datatype: "local" ):

var localRowData = $this.jqGrid("getLocalRow", rowid);
// localRowData.subgrid contains the required data

所以完整的代码是

$("#list").jqGrid("navGrid", "#pager", {edit: false, add: false, del: false, view: true, search: false}, {}, {}, {}, {}, {
    recreateForm: true,
    afterclickPgButtons: function (buttonName, $form, pos) {
        showDetails.call(this, $form);
    },
    beforeShowForm: showDetails,
    labelswidth: '40%'
});

其中函数showDetails定义如下

var showDetails = function ($form) {
    var $this = $(this),
        rowid1 = $this.jqGrid("getGridParam", "selrow"),
        rowid = $("#id_g").val(), //id2 = $form.find("input[name=id]").val(),
        localRowData = $this.jqGrid("getLocalRow", rowid);
    if (isClosed === "Yes") {
        $("#trv_id").show();
    }
    if ($("#mysubgrid").length === 0) {
        // if not in afterclickPgButtons for example
        $("#trv_closed").after('<tr class="FormData">' +
            '<td class="CaptionTD form-view-label ui-widget-content" width="40%"><b>Order Particulars</b></td>' +
            '<td class="DataTD form-view-data ui-helper-reset ui-widget-content"><div style="width:100%;height:100%">' +
            '<table id="mysubgrid"><tr><td>' +
            '</td></tr></table>' +
            '</div></td></tr>');
         $("#mysubgrid").jqGrid({
             datatype: "local",
             data: localRowData.subgrid,
             colNames: ["#", "Amount"],
             colModel: [
                 {name: "no", width: 40, sorttype: "integer"},
                 {name: "amount", width: 70, sorttype: "integer"}
             ],
             idPrefix: "s",
             sortname: "no",
             rowNum: 1000,
             height: "auto"
         });
    } else {
        // update $("#mysubgrid") with new data
        $("#mysubgrid").jqGrid("clearGridData")
            .jqGrid("setGridParam", {data: localRowData.subgrid})
            .trigger("reloadGrid");
    }
};

关于jquery - 在 jqGrid 的 View 模型中添加自定义行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23040186/

相关文章:

javascript - 如何在 jqGrid footerData 中使用 colspan?

jquery - DatePicker 选项 "changemonth"和 "changeyear"在 jqGrid 的编辑表单中不起作用

jquery - 如何将触摸事件[向左/向右滑动]添加到图片库

javascript - DataTables.js 在 row().remove().draw() 调用中删除多行

javascript - 尝试使用 jquery 提供 <divs> onclick 功能

javascript - jQuery-UI 日期选择器 : Uncaught TypeError: Object [object Object] has no method 'zIndex'

javascript - 如何在 cropper 插件中单击模态的交叉按钮清空图像?

php - 如何从 JQGrid 获取值? - 在 HTML5 生成器上

javascript - jqGrid - Safari Mobile 上缺少滚动条

jquery - jqGrid 不显示单行