2012-06-26 16 views
6

में स्वत: पूर्ण के परिणामों के आधार पर एक jqGrid टेक्स्ट कॉलम की संपादन योग्य संपत्ति को बदलना मैं इनलाइन संपादन के साथ jqGrid 4.4.0 का उपयोग कर रहा हूं। इस प्रश्न के लिए, मेरे ग्रिड में चार कॉलम हैं: एक आईडी कॉलम (SomeGridRowId), एक jQuery स्वत: पूर्ण (स्वत: पूर्ण) के साथ एक टेक्स्ट कॉलम, एक एकल वर्ण टेक्स्ट कॉलम (सिंगलरहर), और एक छिपा boolean कॉलम (CanEditSingleChar)। मुझे CanEditSingleChar कॉलम के मान के आधार पर एकल वर्ण कॉलम के संपादन को सक्षम या अक्षम करने की आवश्यकता है। मुझे यह onSelectRow और setColProp का उपयोग कर मौजूदा पंक्तियों पर काम कर रहा है, लेकिन किसी कारण से मैं इसे नई डाली गई पंक्तियों पर सही तरीके से व्यवहार नहीं कर सकता। यदि मैं एक नई पंक्ति जोड़ता हूं और स्वत: पूर्ण से एक मान का चयन करता हूं, तो SingleChar कॉलम हमेशा संपादन योग्य नहीं है। मैंने क्रोम और आईई डेवलपर टूल का उपयोग कर जावास्क्रिप्ट के माध्यम से कदम रखा है; कॉलम मान और गुण ठीक से सेट हो रहे हैं, लेकिन SingleChar कॉलम की editable संपत्ति इसे प्रतिबिंबित नहीं करती है।किसी अन्य कॉलम

मैं विशाल कोड स्निपेट के लिए क्षमा चाहता हूं, लेकिन मैं कुछ भी छोड़ना नहीं चाहता हूं।

$("#coolGrid").jqGrid({ 
    url: '@Url.Action("GetCoolGridData")', 
    postData: { 
     someId: function() { return $("#someId").val(); }, 
     otherStaticArg: function() { return 1; } 
    }, 
    datatype: 'json', 
    mtype: 'POST', 
    loadonce: true, 
    cellsubmit: 'clientArray', 
    editurl: 'clientArray', 
    scroll: true, 
    pager: $("#coolGridPager"), 
    rowNum: 200, 
    sortname: 'SomeGridRowId', 
    sortorder: 'asc', 
    viewrecords: true, 
    height: '100%', 
    colNames: ['SomeGridRowId', 'CanEditSingleChar', 'Autocomplete', 'SingleChar'], 
    colModel: [ 
     { name: 'SomeGridRowId', index: 'SomeGridRowId', hidden: true }, 
     { name: 'CanEditSingleChar', index: 'CanEditSingleChar', hidden: true }, 
     { 
      name: 'Autocomplete', 
      index: 'Autocomplete', 
      width: 220, 
      editable: true, 
      edittype: 'text', 
      editoptions: { 
       dataInit: function (elem) { 
        $(elem).autocomplete({ 
         source: '@Url.Action("GetSomeGridAutocomplete")', 
         minLength: 2, 
         select: function (event, ui) { 
          var rowId = getRowId($(this)); 
          if (ui.item) { 
           $("#coolGrid").jqGrid('setCell', rowId, 'CanEditSingleChar', ui.item.CanEditSingleChar, '', ''); 
           $("#coolGrid").jqGrid('setCell', rowId, 'Autocomplete', ui.item.label, '', ''); 
           setSingleCharEditMode(rowId); 
          } 
         } 
        }); 
       } 
      } 
     }, 
     { 
      name: 'SingleChar', 
      index: 'SingleChar', 
      width: 10, 
      editable: true,  //default to true, most are editable 
      edittype: 'text' 
     } 
    ], 
    onSelectRow: function (clickedRow) { 
     if (clickedRow && clickedRow != $.coolGridLastSelectedRow) { 
      $("#coolGrid").jqGrid('saveRow', $.coolGridSelectedRow, false, 'clientArray'); 
      $.coolGridLastSelectedRow = clickedRow; 
     } 
     setSingleCharEditMode($.coolGridLastSelectedRow); 
     $("#coolGrid").jqGrid('editRow', $.coolGridLastSelectedRow, true); 
    }, 
    afterInsertRow: function (rowid, rowdata, rowelem) { 
     if (rowid == 'new_row') {  //shown solely for completeness, pretty sure this is not the problem 
      var newRowIndex = $("#coolGridNewRowIndex").val(); 
      if (!newRowIndex) 
       newRowIndex = 1; 
      var newRowId = rowid + "_" + newRowIndex; 
      $("#new_row").attr('id', newRowId); 
      newRowIndex++; 
      $("#coolGrid").val(newRowIndex); 
      $("#coolGrid").jqGrid('setSelection', newRowId, true); 
     } 
    } 
}); 
$("#coolGrid").jqGrid('navGrid', '#coolGridPager', 
{ 
    add: false, 
    del: false, 
    edit: false, 
    search: false, 
    beforeRefresh: function() { 
     $("#coolGrid").jqGrid('setGridParam', { datatype: 'json' }); 
    } 
}); 
$("#coolGrid").jqGrid('inlineNav', '#coolGridPager', 
{ 
    edit: false, 
    add: true, 
    addtext: "Add", 
    save: false, 
    cancel: false, 
    restoreAfterSelect: false, 
    addParams: { 
     position: 'last', 
     addRowParams: { 
      keys: true 
     } 
    } 
}); 

और setSingleCharEditMode समारोह:

function setSingleCharEditMode(rowid) { 
    var rowData = $("#coolGrid").jqGrid('getRowData', rowid); 
    if (rowData.CanEditSingleChar === "false") { 
     $("#coolGrid").jqGrid('setColProp', 'SingleChar', { editable: false }); 
    } else { 
     $("#coolGrid").jqGrid('setColProp', 'SingleChar', { editable: true }); 
    } 
} 

मैं सामान की एक पूरी धसान की कोशिश की है, अन्य अतः सवालों के ढेर के माध्यम से rifled कोई लाभ नहीं हुआ पागल की तरह googled .... सब। मैंने अपने बालों को खींचने का सहारा लिया है। मैं किसी अन्य कॉलम पर स्वत: पूर्ण select के बाद एक कॉलम की editable संपत्ति को कैसे नियंत्रित कर सकता हूं, सब एक नई पंक्ति पर?

संपादित
मैं एक working example up here मिल गया है, अंत में। यदि आप एक पंक्ति जोड़ते हैं और फिर Autocomplete कॉलम में "एटिकल *" का चयन करते हैं, तो आप इस व्यवहार को पुन: उत्पन्न कर सकते हैं।

उत्तर

6

वास्तविक उदाहरण के बिना यह बताने में मुश्किल है कि क्यों नई जोड़े गए पंक्तियों को संपादित नहीं किया जा सकता है। साथ ही, jqGrid और अन्य निर्भरताओं के कारण स्वयं को एक साधारण कामकाजी उदाहरण (उदा। jsfiddle या jsbin पर) रखना मुश्किल है।

कुछ सवाल अपने कोड है कि मदद कर सकता है (या क्या आप पहले से ही करने की कोशिश की करने के लिए कोई नई बात नहीं हो सकता है) के माध्यम से देखने के बाद:

  • addRow - कैसे आप एक पंक्ति में शामिल कर सकता, addRow function का उपयोग कर? क्या सबकुछ "jqGrid से संबंधित" नए जोड़े गए पंक्तियों के साथ काम करता है, यानी क्या यह ठीक से शुरू हो जाता है? datatables का उपयोग कर उस तरह की समस्या के साथ मुझे कुछ समस्याएं थीं।

  • सही/अद्वितीय पंक्ति आईडी? - क्या आपने जांच की है कि rowid नई पंक्तियों के लिए अद्वितीय है और यह कि आपके कोड को सही एक (यानी नई पंक्ति से आईडी) के साथ निष्पादित किया गया है? क्या आपने console.log कथन setSingleCharEditMode में देखा है कि क्या हो रहा है (बस यह सुनिश्चित करने के लिए, आपने कहा है कि आप कोड के माध्यम से पहले ही कदम उठा चुके हैं)?

    आप में एक सेल के editable संपत्ति की स्थापना की जा सकती है एक और पंक्ति (इसके बारे में सोच रही थी: यह नहीं हो सकता है, के रूप में सेल डिफ़ॉल्ट रूप से संपादन योग्य होना चाहिए और स्पष्ट रूप से अपने कोड द्वारा संपादित नहीं किया जा रहा है करने के लिए सेट ।)। आसानी से यह देखने के लिए कि कौन सी सेल/पंक्ति पर काम किया जा रहा है, editable संपत्ति के साथ पंक्ति का रंग बदलें।

  • डिफ़ॉल्ट रूप से कार्य करना? - editable का डिफ़ॉल्ट मान true है: क्या आपने को setSingleCharEditMode अक्षम करने का प्रयास किया है और यह देखते हैं कि सेल डिफ़ॉल्ट रूप से संपादन योग्य है? हो सकता है कि समस्या आपका मूल्यांकन न हो लेकिन पंक्ति को स्वयं जोड़ना?

  • सही प्रकार? - setSingleCharEditMode में आप स्ट्रिंग "झूठी" के साथ strict equality के लिए कॉलम मान का परीक्षण करते हैं। क्या आप सुनिश्चित हैं कि के मान मौजूदा और नई लाइनों के लिए समान प्रकार हैं (जैसा कि वे तार हैं और उसी jqGrid कोड के माध्यम से पार्स किया गया है: getRowData)? मुझे लगता है कि आप पहले से ही देखने के लिए पारित कर दिया id साथ चल रहा है और तुलना कि editable संपत्ति

आशा इस समस्या को खोजने के लिए एक छोटे से मदद करता है सेट है console.log कि समारोह में बड़े पैमाने पर ged है। जैसा कि मैंने कहा, एक कामकाजी उदाहरण के बिना डीबग करना वाकई मुश्किल है। आप कहीं कहीं एक रखना चाहते हैं।

[काम कर उदाहरण के बाद संपादित करें]

पहली बात मैं देख रहा हूँ है, कि यदि आप एक मौजूदा संपादन योग्य पंक्ति में "अनियमित उन्मत्त विकार" का चयन करें, एक ही व्यवहार लागू होता है। इसके अलावा: संपादन योग्य पंक्तियां जोड़ना (द्विध्रुवीय कुछ) काम करता है। यह "नई पंक्ति" बनाम "मौजूदा पंक्ति" की समस्या प्रतीत नहीं होता है। संपादन योग्य पंक्तियों के साथ एक समस्या की तरह जो संपादन योग्य नहीं बदला जाता है।

मेरा अनुमान है कि यह हो रहा है है:

  1. आप एक नई पंक्ति जोड़ रहे हैं, स्तंभ SingleChar डिफ़ॉल्ट रूप से संपादन योग्य है, इसलिए <input> दिखाया गया है।
  2. आप सर्वर प्रतिक्रिया का मूल्यांकन करते हैं और स्वत: पूर्ण select हैंडलर में कॉलम को editable : false पर सेट करते हैं।
  3. आप पंक्ति को अचयनित करें और jqGrid सभी तो संपादन योग्य पंक्तियों बदल जाती है, इसलिए इसे SingleChar स्पर्श नहीं करता है, क्योंकि यह सोचता है कि कि SingleChar अपनी प्रारंभिक स्थिति पर रीसेट कर की जरूरत नहीं है ..

क्या मैं समझ रहा हूँ?

jqGrid पंक्ति को रीसेट करने या <input> को हटाने के बाद editablefalse पर सेट करने का प्रयास करें।

+0

आपकी विचारशील प्रतिक्रिया के लिए धन्यवाद। मैं अब ऑनलाइन एक उदाहरण प्राप्त करने पर काम कर रहा हूं। –

+0

क्या आपने कोई प्रगति की है? और आप उस बक्षीस को आवंटित करने के बारे में क्या सोचते हैं? मुझे लगता है कि ग्रेस अवधि समाप्त होने से पहले कोई और जवाब नहीं होगा। – Wolfram

+0

क्षमा करें, वुल्फ्राम, पिछले हफ्ते व्यस्त सप्ताह और मेरे पास पूरी तरह से काम करने वाला नमूना लेने का समय नहीं था। मैं आज इस पर काम करने की उम्मीद कर रहा हूं, लेकिन बक्षीस तुम्हारा है (हालांकि मुझे यकीन नहीं है कि यह 100 तक क्यों विभाजित है)। –

संबंधित मुद्दे