1

我发现自己需要我认为应该是微不足道的要求。我有一个 jqGrid,其中我在每一行中添加了一个自定义按钮。现在我可以将客户端点击事件与它相关联,但我想知道在我的自定义按钮被点击的行的情况下的键值(Id),以便我可以继续使用这个 id 并做任何我想做的事情做。

我的 jqGrid 代码如下

jQuery("#JQGrid").jqGrid({
        url: 'http://localhost:55423/JQGrid/JQGridHandler.ashx',
        datatype: "json",
        colNames: ['', 'Id', 'First Name', 'Created Date', 'Member Price', 'Non Member Price', 'Complete', 'customButton'],
        colModel: [
                    { name: '', index: '', width: 20, formatter: "checkbox", formatoptions: { disabled: false} },
                    { name: 'Id', index: 'Id', width: 20, stype: 'text', sortable: true, key: true },
                    { name: 'FirstName', index: 'FirstName', width: 120, stype: 'text', sortable: true },
                    { name: 'CreatedDate', index: 'CreatedDate', width: 120, editable: true, sortable: true, hidden: true, editrules: { edithidden: true} },
                    { name: 'MemberPrice', index: 'MemberPrice', width: 120, editable: true, sortable: true },
                    { name: 'NonMemberPrice', index: 'NonMemberPrice', width: 120, align: "right", editable: true, sortable: true },
                    { name: 'Complete', index: 'Complete', width: 60, align: "right", editable: true, sortable: true },
                    { name: 'customButton', index: 'customButton', width: 60, align: "right" }
                  ],
        rowNum: 10,
        loadonce: true,
        rowList: [10, 20, 30],
        pager: '#jQGridPager',
        sortname: 'Id',
        viewrecords: true,
        sortorder: 'desc',
        caption: "List Event Details",
        gridComplete: function () {
            jQuery(".jqgrow td input", "#JQGrid").click(function () {
                //alert(options.rowId);
                alert("Capture this event as required");
            });
        }
    });

    jQuery('#JQGrid').jqGrid('navGrid', '#jQGridPager',
               {
                   edit: true,
                   add: true,
                   del: true,
                   search: true,
                   searchtext: "Search",
                   addtext: "Add",
                   edittext: "Edit",
                   deltext:"Delete"
               },
        {/*EDIT EVENTS AND PROPERTIES GOES HERE*/ },
        {/*ADD EVENTS AND PROPERTIES GOES HERE*/},
            {/*DELETE EVENTS AND PROPERTIES GOES HERE*/},
        {/*SEARCH EVENTS AND PROPERTIES GOES HERE*/}
 ); 

帮助或任何指针将不胜感激。

4

2 回答 2

2

您的问题的主要解决方案如下:您需要包含参数,例如e,在clickhandle的回调中。该参数具有包含目标属性的事件对象类型。或者,您可以在大多数情况下使用。让你可以去最近的父元素。这是您需要的值:thise.target<tr>id

jQuery(this).find(".jqgrow td input").click(function (e) {
    var rowid = $(e.target).closest("tr").attr("id");
    alert(rowid);
});

此外,您应该在代码中进行一些其他修改以修复一些错误。的使用

name: '', index: ''

中是错误colModel。您应该指定任何非空的唯一名称。例如name: 'mycheck'.

接下来我建议您. 如果您使用,则必须使用与相应值具有相同值的属性。如果您不指定任何属性,您将拥有更小且可读性更好的代码。jqGrid 会在内部从相应的值中复制相应的属性值。以同样的方式,您可以删除属性,例如哪些值是默认值(请参阅文档的列)indexcolModelloadonce: trueindexnameindexindexnamestype: 'text', sortable: trueDefault

下一个问题是您可能在来自服务器的 JSON 响应中包含 HTML 数据。(例如,看不到任何格式化程序customButton)。这样不好。如果网格的文本包含特殊的 HTML 符号,您可能会遇到问题。我发现在来自服务器的 JSON 响应中使用纯数据更好。可以在客户端使用格式化程序、自定义格式化程序等。在这种情况下,可以使用autoencode: truejqGrid 选项对网格中显示的所有文本进行 HTML 编码。这样,您将拥有更安全的代码,不允许任何注入(例如,在编辑数据期间不包括 JavaScript 代码)。

下一条评论:我不建议您使用gridComplete. 的使用loadComplete效果更好。请参阅我关于该主题的旧答案。

最后一句重要的话。要处理click放置在网格内的按钮上的事件,不需要将单独click的句柄绑定到每个按钮。而不是那个可以使用一个 beforeSelectRowonCellSelect回调。e 上的答案this描述了这一点。答案<a>在自定义格式化程序中使用,但<input>工作方式完全相同。

于 2013-08-31T07:54:17.937 回答
0

另一种可用于检索单击自定义按钮的行的 id 的方法是将格式化程序添加到自定义按钮 cloumn

{ name: 'customButton', index: 'customButton', width: 60, align: "right", 
  formatter: function ( cellvalue, options, rowObject ) {

    return "<input type='button' class='custom-button' id='custom"+ rowObject.id +"'/>";
  } 
}

现在每个按钮都有行 id

$('input[id^="custom"]').click(function() {
  var id = this.attr('id').replace("custom", ""); // required row ID
});
于 2013-09-07T18:56:40.950 回答