Как создать контекстное меню jqGrid? - PullRequest
11 голосов
/ 07 июля 2011

Я пытаюсь создать контекстное меню в jqGrid (для каждой строки), но не могу найти, как это сделать. В настоящее время я использую контекстное меню jQuery (есть ли лучший способ?), Но это для всей сетки не для конкретной строки, т.е. не может выполнять операции на уровне строки для нее. Пожалуйста, помогите мне в этом, спасибо.

$(document).ready(function(){ 
  $("#list1").jqGrid({
    sortable: true,
    datatype: "local", 
    height: 250, 
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], 
    colModel:[ 
        {name:'id',index:'id', width:60, sorttype:"int"}, 
        {name:'invdate',index:'invdate', width:90, sorttype:"date"}, 
        {name:'name',index:'name', width:100}, 
        {name:'amount',index:'amount', width:80, align:"right",sorttype:"float"}, 
        {name:'tax',index:'tax', width:80, align:"right",sorttype:"float"}, 
        {name:'total',index:'total', width:80,align:"right",sorttype:"float"}, 
        {name:'note',index:'note', width:50, sortable:false} 
        ], 
    multiselect: true,
    rowNum:10, 
    rowList:[10,20,30], 
    pager: '#pager1', 
    sortname: 'id', 
    recordpos: 'left', 
    viewrecords: true, 
    sortorder: "desc",
    caption: "Manipulating Array Data"
  });
  $("#list1").jqGrid('navGrid','#pager1',{add:false,del:false,edit:false,position:'right'});

  $("#list1").contextMenu({
        menu: "myMenu"
    },
        function(action, el, pos) {
        alert(
            "Action: " + action + "\n\n" +
            "Element ID: " + $(el).attr("id") + "\n\n" +
            "X: " + pos.x + "  Y: " + pos.y + " (relative to element)\n\n" +
            "X: " + pos.docX + "  Y: " + pos.docY+ " (relative to document)"
            );
    });

Ответы [ 3 ]

17 голосов
/ 07 июля 2011

Есть много плагинов контекстного меню. Один из них вы найдете в подкаталоге plugins источника jqGrid.

Чтобы использовать его, вы можете, например, определить свое контекстное меню, например, с помощью следующей разметки HTML:

<div class="contextMenu" id="myMenu1" style="display:none">
    <ul style="width: 200px">
        <li id="add">
            <span class="ui-icon ui-icon-plus" style="float:left"></span>
            <span style="font-size:11px; font-family:Verdana">Add Row</span>
        </li>
        <li id="edit">
            <span class="ui-icon ui-icon-pencil" style="float:left"></span>
            <span style="font-size:11px; font-family:Verdana">Edit Row</span>
        </li>
        <li id="del">
            <span class="ui-icon ui-icon-trash" style="float:left"></span>
            <span style="font-size:11px; font-family:Verdana">Delete Row</span>
        </li>
    </ul>
</div>

Вы можете привязать контекстное меню к строкам сетки внутри loadComplete (после размещения строк в <table>):

loadComplete: function() {
    $("tr.jqgrow", this).contextMenu('myMenu1', {
        bindings: {
            'edit': function(trigger) {
                // trigger is the DOM element ("tr.jqgrow") which are triggered
                grid.editGridRow(trigger.id, editSettings);
            },
            'add': function(/*trigger*/) {
                grid.editGridRow("new", addSettings);
            },
            'del': function(trigger) {
                if ($('#del').hasClass('ui-state-disabled') === false) {
                    // disabled item can do be choosed
                    grid.delGridRow(trigger.id, delSettings);
                }
            }
        },
        onContextMenu: function(event/*, menu*/) {
            var rowId = $(event.target).closest("tr.jqgrow").attr("id");
            //grid.setSelection(rowId);
            // disable menu for rows with even rowids
            $('#del').attr("disabled",Number(rowId)%2 === 0);
            if (Number(rowId)%2 === 0) {
                $('#del').attr("disabled","disabled").addClass('ui-state-disabled');
            } else {
                $('#del').removeAttr("disabled").removeClass('ui-state-disabled');
            }
            return true;
        }
    });
}

В примере я отключил пункт меню "Del" для всех строк, имеющих четный rowid. Отключенные пункты меню перенаправляют выбор элемента, поэтому необходимо контролировать, отключен ли элемент еще раз внутри bindings.

Я использовал выше $("tr.jqgrow", this).contextMenu('myMenu1', {...});, чтобы привязать одно и то же меню ко всем строкам сетки. Конечно, вы можете привязать разные строки к различным меню: $("tr.jqgrow:even", this).contextMenu('myMenu1', {...}); $("tr.jqgrow:odd", this).contextMenu('myMenu2', {...});

Я не внимательно прочитал код contextMenu, и, вероятно, приведенный выше пример не самый лучший, но он работает очень хорошо. Вы можете увидеть соответствующую демонстрацию здесь . Демонстрация имеет много других функций, но вы должны взглянуть только на обработчик событий loadComplete.

5 голосов
/ 07 июля 2011

вы можете посмотреть на событие onRightClickRow

JqGridWiki

jQuery("#gridid").jqGrid({
...
   onRightClickRow: function(rowid, iRow, iCol, e){ 
      //Show context menu ...

   },
...
})

Из Wiki ... onRightClickRow

Имя события

onRightClickRow

Параметры

rowid, iRow, iCol, e

Информация

Возникает сразу после щелчка правой кнопкой мыши по строке.rowid - это идентификатор строки, iRow - это индекс строки (не смешивайте это с rowid), iCol - это индекс ячейки.е является объектом события.Примечание. Это событие не работает в браузерах Opera, поскольку Opera не поддерживает событие oncontextmenu

1 голос
/ 26 мая 2014

Вы можете попробовать это:

jQuery("#yourid").jqGrid({

...

{name:'req_name',index:'req_name', width:'9%', sortable:true},

.....

 loadComplete:function(request){

...

               $("[aria-describedby='yourid_req_name']", this).contextMenu('myMenu1',{ 
                    onContextMenu: function(e) {
                        var rowId = $(e.target).closest("tr.jqgrow").attr("id");
                            $("#send").html('<a onclick="send_email('+rowId+')">Send Email</a>');
                            return true;    
                    }
                });
},

........... и HTML-код:

<div class="contextMenu" id="myMenu1" style="display:none">
        <ul style="width: 400px">
            <li id="send">
                <span>Add Row</span>
            </li>
        </ul>
    </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...