Jqgrid 使用multiselect、multibox和scroll在输入时进行内联编辑:1

Jqgrid 使用multiselect、multibox和scroll在输入时进行内联编辑:1,jqgrid,Jqgrid,如果在jqGrid中按Enter键并且还使用multiselect:true选项,如何启动内联编辑? 如果存在MultiHelp,则jqGrid bindKeys函数没有任何效果 为了验证以下测试用例是否可用(基于Oleg注释中提供的示例) 复制步骤: 将下面的代码保存到html文件,并在IE 9中打开它 在网格中单击并按enter键 观察到: 消息框不显示 同时上下箭头移动整个网格 预期: 按Enter键会导致出现消息框 上下箭头应更改网格中的当前行 如何获得预期的行为 <!DOCTYP

如果在jqGrid中按Enter键并且还使用multiselect:true选项,如何启动内联编辑? 如果存在MultiHelp,则jqGrid bindKeys函数没有任何效果

为了验证以下测试用例是否可用(基于Oleg注释中提供的示例)

复制步骤:

  • 将下面的代码保存到html文件,并在IE 9中打开它
  • 在网格中单击并按enter键
  • 观察到:

  • 消息框不显示
  • 同时上下箭头移动整个网格
  • 预期:

  • 按Enter键会导致出现消息框
  • 上下箭头应更改网格中的当前行
  • 如何获得预期的行为

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>http://stackoverflow.com/questions/5988767/highlight-error-cell-or-input-when-validation-fails-in-jqgrid</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
        <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/redmond/jquery-ui.css" />
        <link rel="stylesheet" type="text/css" href="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.0.0/css/ui.jqgrid.css" />
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
        <script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.0.0/js/i18n/grid.locale-en.js"></script>
        <script type="text/javascript">
            $.jgrid.no_legacy_api = true;
            $.jgrid.useJSON = true;
        </script>
        <script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.0.0/js/jquery.jqGrid.min.js"></script>
        <script type="text/javascript">
            $(function () {
                var mydata = [
                        { id: "1", invdate: "2007-10-01", name: "test", note: "note", amount: "200.00", tax: "10.00", closed: true, ship_via: "TN", total: "210.00" },
                        { id: "2", invdate: "2007-10-02", name: "test2", note: "note2", amount: "300.00", tax: "20.00", closed: false, ship_via: "FE", total: "320.00" },
                        { id: "3", invdate: "2007-09-01", name: "test3", note: "note3", amount: "400.00", tax: "30.00", closed: false, ship_via: "FE", total: "430.00" },
                        { id: "4", invdate: "2007-10-04", name: "test4", note: "note4", amount: "200.00", tax: "10.00", closed: true, ship_via: "TN", total: "210.00" },
                        { id: "5", invdate: "2007-10-31", name: "test5", note: "note5", amount: "300.00", tax: "20.00", closed: false, ship_via: "FE", total: "320.00" },
                        { id: "12", invdate: "2007-09-10", name: "test12", note: "note12", amount: "500.00", tax: "30.00", closed: false, ship_via: "FE", total: "530.00" }
                    ];
    
                var grid = $("#grid");
                grid.jqGrid({
                    datatype: 'local',
                    data: mydata,
                    colModel: [
                        { name: 'invdate', editable: true, width: 30 },
                        { name: 'name', editable: true, width: 271 }
                    ],
                    gridview: true,
                    pager: '#pager',
                    viewrecords: true,
                    multikey: "ctrlKey",  // added July 6, 2011
                    scroll:1,  // added July 6, 2011 todo: data should passed from URL
                    multiselect: true,
                    multiboxonly: true,
                    editurl: 'clientArray'
                });
    
            $("#grid").jqGrid('bindKeys', {
                onEnter: function (rowid) {
                    alert("You enter a row with id: " + rowid);
                }
            });
          });
        </script>
    </head>
    <body>
            <table id="grid"></table>
            <div id="pager"></div>
    </body>
    </html>
    
    
    http://stackoverflow.com/questions/5988767/highlight-error-cell-or-input-when-validation-fails-in-jqgrid
    $.jgrid.no_legacy_api=true;
    $.jgrid.useJSON=true;
    $(函数(){
    var mydata=[
    {id:“1”,invdate:“2007-10-01”,name:“test”,note:“note”,amount:“200.00”,tax:“10.00”,closed:true,ship_via:“TN”,total:“210.00”},
    {id:“2”,invdate:“2007-10-02”,name:“test2”,note2,amount:“300.00”,tax:“20.00”,closed:false,ship_via:“FE”,total:“320.00”},
    {id:“3”,invdate:“2007-09-01”,name:“test3”,note3,amount:“400.00”,tax:“30.00”,closed:false,ship_via:“FE”,total:“430.00”},
    {id:“4”,invdate:“2007-10-04”,name:“test4”,note4,amount:“200.00”,tax:“10.00”,closed:true,ship_via:“TN”,total:“210.00”},
    {id:“5”,invdate:“2007-10-31”,name:“test5”,note5,amount:“300.00”,tax:“20.00”,closed:false,ship_via:“FE”,total:“320.00”},
    {id:“12”,invdate:“2007-09-10”,name:“test12”,note12,amount:“500.00”,tax:“30.00”,closed:false,ship_via:“FE”,total:“530.00”}
    ];
    风险值网格=$(“#网格”);
    grid.jqGrid({
    数据类型:“本地”,
    数据:mydata,
    colModel:[
    {name:'invdate',可编辑:true,宽度:30},
    {name:'name',可编辑:true,宽度:271}
    ],
    gridview:没错,
    寻呼机:“#寻呼机”,
    viewrecords:是的,
    多键:“ctrlKey”//于2011年7月6日添加
    滚动:1,//添加了2011年7月6日todo:应从URL传递数据
    多选:对,
    multiboxonly:正确,
    editurl:“客户端阵列”
    });
    $(“#网格”).jqGrid('bindKeys'{
    onEnter:函数(rowid){
    警报(“您输入了id为“+rowid”的行);
    }
    });
    });
    
    更新:仅添加multiboxonly:对testcase为true请勿取消集中上一行未选中的问题

    更新


    在测试用例中添加了多键:“ctrlKey”。在这种情况下,Oleg answer中建议的bindKeys停止工作

    您发布的代码应该可以工作。可能你用错地方了

    唯一需要考虑的是,编辑行结束后,焦点会丢失,并且不能使用箭头移动到下一行。您应该使用方法的
    aftersavefunc
    参数来恢复网格焦点:

    var grid = $('#grid');
    grid.jqGrid('editRow',rowid,true,null, null, null, {},function(){
        setTimeout(function(){
            grid.focus();
        },100);
    });
    
    是对演示的小修改。可以使用键盘移动行选择,然后按enter键开始内联编辑并保存行

    已更新:我要求您始终在原始问题后附加附加附加信息,而不是完全重写问题。您最初的问题中没有任何关于
    multiselect:true
    用法的内容。这个案例(
    multiselect:false
    )和我的第一个演示对其他用户来说可能很有趣。因此,一般做法是在原始问题后面加上“UPDATED:”部分,或者只是问一个新问题。目前,如果有人阅读你的问题和我的答案,他/她会想:“多么奇怪的答案?可能答案没有仔细阅读问题。”

    现在谈谈您当前遇到的
    multiselect:true
    问题。您如何知道jqGrid 4.0.0是第一个版本,它在网格和treegrid中具有
    bindKeys
    方法。解决方案远非十全十美。许多操作都不能用键盘完成。例如,导航工具栏中的按钮(“添加”、“编辑”、“删除”等)不能按键盘。要在jqGrid中使用键盘导航,jqGrid代码的许多地方都通过设置
    tabindex
    属性进行了扩展。例如,在所选行(
    元素)中,接收属性
    tabindex=“0”
    ,但该行仅在
    多选:false
    的情况下工作。在代码中,将搜索(但未找到)属性
    tabindex=“0”
    。因此,
    bindKeys
    的当前实现在
    multiselect:true
    模式下不起作用

    正如我之前所写的那样,只有在jqGrid代码中进行许多更改,才能实现对
    multiselect:true
    模式的完全支持。作为一种解决方法,我可以建议如下:我们只能用更改的实现覆盖
    bindKeys
    方法的代码

    您可以找到相应的演示。演示中的JavaScript代码是:

    $.extend($.fn.jqGrid,{
        bindKeys : function( settings ){
           'use strict';
            var o = $.extend({
                onEnter: null,
                onSpace: null,
                onLeftKey: null,
                onRightKey: null,
                scrollingRows : true
            },settings || {});
            return this.each(function(){
                var $t = this;
                if( !$('body').is('[role]') ){$('body').attr('role','application');}
                $t.p.scrollrows = o.scrollingRows;
                $($t).keydown(function(event){
                    var target = $($t).find('tr[tabindex=0]')[0], id, mind, r,
                    expanded = $t.p.treeReader.expanded_field;
                    if (!target && $t.p.selrow !== null) {
                        target = $t.rows.namedItem($t.p.selrow);
                    }
                    //check for arrow keys
                    if(target) {
                        mind = $t.p._index[target.id];
                        if(event.keyCode === 37 || event.keyCode === 38 || event.keyCode === 39 || event.keyCode === 40){
                            // up key
                            if(event.keyCode === 38 ){
                                r = target.previousSibling;
                                id = "";
                                if(r) {
                                    if($(r).is(":hidden")) {
                                        while(r) {
                                            r = r.previousSibling;
                                            if(!$(r).is(":hidden") && $(r).hasClass('jqgrow')) {id = r.id;break;}
                                        }
                                    } else {
                                        id = r.id;
                                    }
                                }
                                if ($.inArray(id,$t.p.selarrrow) === -1) {
                                    $($t).jqGrid('setSelection', id);
                                } else {
                                    $t.p.selrow = id;
                                }
                            }
                            //if key is down arrow
                            if(event.keyCode === 40){
                                r = target.nextSibling;
                                id ="";
                                if(r) {
                                    if($(r).is(":hidden")) {
                                        while(r) {
                                            r = r.nextSibling;
                                            if(!$(r).is(":hidden") && $(r).hasClass('jqgrow') ) {id = r.id;break;}
                                        }
                                    } else {
                                        id = r.id;
                                    }
                                }
                                if ($.inArray(id,$t.p.selarrrow) === -1) {
                                    $($t).jqGrid('setSelection', id);
                                } else {
                                    $t.p.selrow = id;
                                }
                            }
                            // left
                            if(event.keyCode === 37 ){
                                if($t.p.treeGrid && $t.p.data[mind][expanded]) {
                                    $(target).find("div.treeclick").trigger('click');
                                }
                                if($.isFunction(o.onLeftKey)) {
                                    o.onLeftKey.call($t, $t.p.selrow);
                            }
                            }
                            // right
                            if(event.keyCode === 39 ){
                                if($t.p.treeGrid && !$t.p.data[mind][expanded]) {
                                    $(target).find("div.treeclick").trigger('click');
                                }
                                if($.isFunction(o.onRightKey)) {
                                    o.onRightKey.call($t, $t.p.selrow);
                            }
                            }
                            return false;
                        }
                        //check if enter was pressed on a grid or treegrid node
                        else if( event.keyCode === 13 ){
                            if($.isFunction(o.onEnter)) {
                                o.onEnter.call($t, $t.p.selrow);
                            }
                            return false;
                        } else if(event.keyCode === 32) {
                            if($.isFunction(o.onSpace)) {
                                o.onSpace.call($t, $t.p.selrow);
                            }
                            return false;
                        }
                    }
                });
            });
        }
    });
    

    我再重复一遍,我发现我发布的代码并不完美。一个人应该使哪条线有焦点,并使更多的东西可见。我只想说明应该做什么样的更改以及在哪里进行更改,以允许对细布网格进行键盘导航

    编辑

    如果多键,则添加“ctrlKey”键。答案中的代码不起作用。阿尔索
    var grid = $("#list");
    ...
    
    grid.jqGrid('bindKeys', {
        onEnter: function(rowid) {
            //alert("You enter a row with id: " + rowid);
            editingRowId = rowid; // probably cab be replaced to grid[0].p.selrow
            // we use aftersavefunc to restore focus
            grid.jqGrid('editRow',rowid,true,null, null, null, {},function(){
                setTimeout(function(){
                    grid.focus();
                },100);
            });
        },
        onSpace: function(rowid) {
            grid.jqGrid('setSelection', rowid);
        }
    });
    
    // select one row at the begining and set the focus
    grid.jqGrid('setSelection',"1");
    grid.focus();