【问题标题】:jqgrid - calendar icon not showing up in inline editing modejqgrid - 日历图标未在内联编辑模式下显示
【发布时间】:2012-02-01 08:50:34
【问题描述】:

在内联编辑模式下不显示日历图标。我正在使用 jquery.ui.datepicker.js

HTML

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Jquery Grid</title>
        <link rel="stylesheet" type="text/css" media="screen" href="themes/redmond/jquery-ui-1.8.1.custom.css" />
        <link rel="stylesheet" type="text/css" media="screen" href="themes/ui.jqgrid.css" />
        <link rel="stylesheet" type="text/css" media="screen" href="themes/ui.multiselect.css" />
        <script src="js/jquery-1.6.4.js" type="text/javascript"></script>
        <script src="js/jquery-ui-1.8.14.custom.min.js" type="text/javascript"></script>
        <script src="js/jquery.layout.js" type="text/javascript"></script>
        <script src="js/i18n/grid.locale-en.js" type="text/javascript"></script>
        <script src="js/jquery.jqGrid.min.js" type="text/javascript"></script>
        <script src="js/jquery.corner.js" type="text/javascript"></script>      
        <script src="plugins/ui.multiselect.js" type="text/javascript"></script>
        <script src="plugins/jquery.tablednd.js" type="text/javascript"></script>
        <script src="plugins/jquery.contextmenu.js" type="text/javascript"></script>
        <script src="js/jquery.ui.datepicker.js" type="text/javascript"></script>       
    </head>
    <body>
        <div id="content">
            <div class="userinfo">
                <table id="myjqgrid"></table>
                <div id="Pager"></div>                  
                <script src="js/myjqgrid.js" type="text/javascript"></script>                   
            </div>
        </div>
    </body>
</html>

JSON

{
    "colModel": [
        {
            "name": "ID",
            "label": "ID",
            "width": 60,
            "align": "left",
            "jsonmap": "cells.0.value",
            "sortable": true      
        },
        {
            "name": "FirstName",
            "label": "FirstName",
            "width": 100,
            "align": "left",
            "jsonmap": "cells.1.value",
            "sortable": false       
        },
        {
            "name": "LastName",
            "label": "LastName",
            "width": 100,
            "align": "left",
            "jsonmap": "cells.2.value",
            "sortable": false       
        },
        {
            "name": "Date",
            "label": "Date",
            "width": 100,
            "align": "left",
            "jsonmap": "cells.3.value",
            "sortable": false       
        }
    ],
    "colNames": [
        "ID",
        "FirstName",
        "LastName",
        "Date"
    ],
    "mypage": {
        "outerwrapper": {
            "page":"1",
            "total":"1",
            "records":"20",
            "innerwrapper": {
                "rows":[
                    {
                        "id":"1",
                        "cells":
                        [               
                            {
                                "value":"12345",
                                "label": "ID",
                                "editable": false                       
                            },
                            {
                                "value":"David",
                                "label": "FirstName",
                                "editable": false    
                            },
                            {                           
                                "value":"Smith",
                                "label": "LastName",
                                "editable": false                         
                            },
                            {                           
                                "value":"01/02/2012",
                                "label": "Date",
                                "editable": true,
                                "editformat": "text"                         
                            }                                                                                        
                        ]       
                    },
                    {
                        "id":"2",
                        "cells":
                        [               
                            {
                                "value":"37546",
                                "label": "ID",
                                "editable": false                       
                            },
                            {
                                "value":"Willy",
                                "label": "FirstName",
                                "editable": false    
                            },
                            {                           
                                "value":"Peacock",
                                "label": "LastName",
                                "editable": false                         
                            },
                            {                           
                                "value":"01/02/2012",
                                "label": "Date",
                                "editable": true,
                                "editformat": "text"                         
                            }                                                                                        
                        ]       
                    }
                ]
            }
        }
    }
}

JQGrid 定义

$(document).ready(function () { 
    var serverData = [];
    var showCalImg = function(id){
        $("#" + id + "_date").datepicker({
            showOn: 'button',
            buttonImageOnly: true,
            dateFormat: 'mmddyy',
            buttonImage: 'images/calendar.gif'
        });
    }
    $.ajax({
        type: "GET",
        url: "myjqgrid.json",
        data: "",
        dataType: "json",
        success: function(response){
            var columnData = response.mypage.outerwrapper,
                columnNames = response.colNames,
                columnModel = response.colModel;

            $("#myjqgrid").jqGrid({
                datatype: 'jsonstring',
                datastr: columnData,                
                colNames: columnNames,
                colModel: columnModel,
                jsonReader: {
                    root: "innerwrapper.rows",              
                    repeatitems: false
                },
                gridview: true,
                pager: "#Pager",
                rowNum: 21,
                rowList: [21],
                viewrecords: true,              
                recordpos: 'left',
                multiboxonly: true,
                multiselect: true,
                sortname: 'ID',
                sortorder: "desc",  
                sorttype: "text",   
                sortable: true,
                caption: "<h2>MY JQGRID</h2>",
                width: "1406",      
                height: "100%",
                scrolloffset: 0,    
                loadonce: true,     
                cache: true,
                onSelectRow: function(id) {
                    $("table#myjqgrid").editRow(id, true, showCalImg);
                },
                loadComplete: function(){
                    var rowCounter, cellCounter, cellProperty, itemRows;
                    for (rowCounter = 0; rowCounter < response.mypage.outerwrapper.innerwrapper.rows.length; rowCounter++) {
                        itemRows = response.mypage.outerwrapper.innerwrapper.rows[rowCounter];
                        serverData[itemRows.recordnbr] = itemRows.cells;                        
                        var cellCount = response.mypage.outerwrapper.innerwrapper.rows[rowCounter].cells.length;
                        for (cellCounter = 0; cellCounter < cellCount; cellCounter += 1) {
                            cellProperty = response.mypage.outerwrapper.innerwrapper.rows[rowCounter].cells[cellCounter];
                            var isEditable = cellProperty.editable;
                            var cellEditFormat = cellProperty.editformat;
                            if (isEditable === false) {
                                $("#myjqgrid").setColProp(cellProperty.label, {
                                    editable: false
                                });
                            }else{
                                if (isEditable === true) {
                                    $("#myjqgrid").setColProp(cellProperty.label, {
                                        editable: true,
                                        edittype: cellProperty.editformat,
                                        editoptions: {
                                            size: cellProperty.size,
                                            maxlength: cellProperty.maxlength
                                        }
                                    });
                                }
                            }

                        }
                    }
                }
            });
            $("#myjqgrid").jqGrid('navGrid','#Pager', {add:false, edit:false, del:false, position: 'right'});
        }
    });
});

【问题讨论】:

    标签: json jquery-ui jqgrid


    【解决方案1】:

    您的代码中的主要问题是 JSON 数据不包含 sizemaxlength 属性。如果不使用editoptionssize 属性,则width: 98% 将通过&lt;input&gt; 上的内联编辑来设置,并且将无法显示按钮。

    下一个问题是您使用"name": "Date" 作为日期列,但在代码中使用$("#" + id + "_date") 而不是$("#" + id + "_Date")。所以不会初始化日期选择器。

    附加问题:如果包含jquery-ui-1.8.14.custom.min.js,则datepicker的代码将已包含,您无需另外包含jquery.ui.datepicker.js

    最后一个问题是 datepickershowOn: 'button' 仅当您在与 setTimeout JavaScript 函数相关的单独线程中启动 datepicker 时才有效。

    修复上述问题后,代码可以正常工作(见the demo),但是图标的位置不太好:

    要固定&lt;img&gt; 的位置,您可以在datepicker 初始化之后直接使用以下代码:

    $("#" + id + ' img.ui-datepicker-trigger').css({
        position: "relative",
        top: "4px"
    });
    

    结果你会得到以下结果(见the demo

    我个人宁愿不要在按钮中使用任何图像,而是使用 jQuery UI 按钮。我创建了one more demo,它显示了看起来更好的方式。

    我将定义为日期的列

    { name: 'invdate', index: 'invdate', width: 110, template: dateTemplate }
    

    使用templatedateTemplate 我会定义为

    var dateTemplate = {align: 'center', sorttype: 'date', editable: true,
            formatter: 'date', formatoptions: { newformat: 'd-M-Y' }, datefmt: 'd-M-Y',
            editoptions: { dataInit: initDateWithButton, size: 11 },
            searchoptions: {
                sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'],
                dataInit: initDateWithButton,
                size: 11,          // for the advanced searching dialog
                attr: {size: 11}   // for the searching toolbar
            }};
    

    (您可以选择任何符合您要求的日期格式)。函数initDateWithButton可以定义为

    var initDateWithButton = function (elem) {
            if (/^\d+%$/.test(elem.style.width)) {
                // remove % from the searching toolbar
                elem.style.width = '';
            }
            // to be able to use 'showOn' option of datepicker in advance searching dialog
            // or in the editing we have to use setTimeout
            setTimeout(function () {
                $(elem).datepicker({
                    dateFormat: 'dd-M-yy',
                    showOn: 'button',
                    changeYear: true,
                    changeMonth: true,
                    showWeek: true,
                    showButtonPanel: true,
                    onClose: function (dateText, inst) {
                        inst.input.focus();
                    }
                });
                $(elem).next('button.ui-datepicker-trigger').button({
                    text: false,
                    icons: {primary: 'ui-icon-calculator'}
                }).find('span.ui-button-text').css('padding', '0.1em');
            }, 100);
        };
    

    结果你会得到如图所示的日期选择器

    【讨论】:

    • 你知道如何解决这个问题吗? - stackoverflow.com/questions/9107258/…
    • @Andrus:我不确定我是否理解您的意思,但为什么不将'invdate' 列的width 属性从width: 110 增加到更高的值?
    • @Oleg:增加宽度会在右侧增加额外的可用空间。我正在寻找一种减少日期字段宽度以删除未使用的空白空间的方法。我把这个贴在stackoverflow.com/questions/9619480/…
    • @Andrus:我给你发了答案。
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 2011-11-28
    • 2016-12-16
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多