2012-01-03 7 views
1

Значок календаря не отображается в режиме встроенного редактирования. Я использую jquery.ui.datepicker.jsjqgrid - значок календаря не отображается в режиме встроенного редактирования

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'}); 
     } 
    }); 
}); 

ответ

3

Основная проблема вашего кода в том, что данные JSON не включают size и maxlength. Если вы не используете свойство sizeeditoptions, то width: 98% будет устанавливаться встроенным редактированием на <input>, и у вас не останется места для отображения кнопки.

Следующая проблема заключается в том, что вы используете "name": "Date" для столбца Date, но используете $("#" + id + "_date") вместо $("#" + id + "_Date") в вашем коде. Таким образом, датапикер не будет инициализирован.

Дополнительная проблема: если вы включили jquery-ui-1.8.14.custom.min.js, код datepicker будет включен, и вам не нужно дополнительно включать jquery.ui.datepicker.js.

Последняя проблема заключается в том, что datepicker с showOn: 'button' работает, только если вы запустите datepicker в отдельном потоке относительно setTimeout Функция JavaScript.

После фиксации описанной выше проблемы код будет работать (см the demo), но положение значка будет не так приятно:

enter image description here

Чтобы исправить положение <img> вы можете использовать следующий код непосредственно после datepicker инициализации:

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

в результате вы будете иметь следующие результаты (см the demo)

enter image description here

лично я предпочел бы не использовать какие-либо изображения на кнопках и использовать кнопки JQuery UI вместо. Я создал one more demo, который показывает способ, который выглядит мне лучше.

В столбце с датой я бы определяет как

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

использованием template. dateTemplate я бы определил, как

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); 
    }; 

В результате вы имеете DatePicker, который выглядит как на картинке

enter image description here

+0

Спасибо большое, Олег! – techlead

+0

вы бы знали, как это решить? - http://stackoverflow.com/questions/9107258/jqgrid-how-to-add-parameters-to-extraparam-of-saverow-in-inline-editing-mode – techlead

+0

@ Andrus: Я не уверен, что я понимаю, что вы имеете в виду, но почему бы не просто увеличить свойство 'width' столбца' 'invdate'' от' width: 110' до некоторого более высокого значения? – Oleg

Смежные вопросы