How to get a jqGrid cell value when editing

前端 未结 23 2326
日久生厌
日久生厌 2020-11-27 17:43

How to get a jqGrid cell value when in-line editing (getcell and getRowData returns the cell content and not the actuall value of the input element).

相关标签:
23条回答
  • 2020-11-27 18:20

    This is my solution:

                    function getDataLine(grida, rowid){  //vykradeno z inineeditu a vohackovano
    
                        if(grida.lastIndexOf("#", 0) === 0){
                            grida = $(grida);
                        }else{
                            grida = $("#"+grida);
                        }
    
                        var nm, tmp={}, tmp2={}, tmp3= {}, editable, fr, cv, ind;
    
                        ind = grida.jqGrid("getInd",rowid,true);
                        if(ind === false) {return success;}
                        editable = $(ind).attr("editable");
                        if (editable==="1") {
                            var cm;
                            var colModel = grida.jqGrid("getGridParam","colModel") ;
                            $("td",ind).each(function(i) {
                                // cm = $('#mygrid').p.colModel[i];
                                cm = colModel[i];
                                nm = cm.name;
                                if ( nm != 'cb' && nm != 'subgrid' && cm.editable===true && nm != 'rn' && !$(this).hasClass('not-editable-cell')) {
                                    switch (cm.edittype) {
                                        case "checkbox":
                                            var cbv = ["Yes","No"];
                                            if(cm.editoptions ) {
                                                cbv = cm.editoptions.value.split(":");
                                            }
                                            tmp[nm]=  $("input",this).is(":checked") ? cbv[0] : cbv[1]; 
                                            break;
                                        case 'text':
                                        case 'password':
                                        case 'textarea':
                                        case "button" :
                                            tmp[nm]=$("input, textarea",this).val();
                                            break;
                                        case 'select':
                                            if(!cm.editoptions.multiple) {
                                                tmp[nm] = $("select option:selected",this).val();
                                                tmp2[nm] = $("select option:selected", this).text();
                                            } else {
                                                var sel = $("select",this), selectedText = [];
                                                tmp[nm] = $(sel).val();
                                                if(tmp[nm]) { tmp[nm]= tmp[nm].join(","); } else { tmp[nm] =""; }
                                                $("select option:selected",this).each(
                                                    function(i,selected){
                                                        selectedText[i] = $(selected).text();
                                                    }
                                                );
                                                tmp2[nm] = selectedText.join(",");
                                            }
                                            if(cm.formatter && cm.formatter == 'select') { tmp2={}; }
                                            break;
                                    }
                                }
                            });
                        }
                        return tmp;
                    }
    
    0 讨论(0)
  • 2020-11-27 18:21

    Here is an example of basic solution with a user function.

        ondblClickRow: function(rowid) {
            var cont = $('#grid').getCell(rowid, 'MyCol');
            var val = getCellValue(cont);
        }
    

    ...

    function getCellValue(content) {
        var k1 = content.indexOf(' value=', 0);
        var k2 = content.indexOf(' name=', k1);
        var val = '';
        if (k1 > 0) {
            val = content.substr(k1 + 7, k2 - k1 - 6);
        }
        return val;
    }
    
    0 讨论(0)
  • 2020-11-27 18:23

    Basically, you have to save the row before you access the cell contents.

    If you do, then you get the value for the cell instead of the markup that comes when the cell is in edit mode.

    jQuery.each(selectedRows, function(index, foodId) {
                // save the row on the grid in 'client array', I.E. without a server post
                $("#favoritesTable").saveRow(foodId, false, 'clientArray'); 
    
                // longhand, get grid row based on the id
                var gridRow = $("#favoritesTable").getRowData(foodId);
    
                // reference the value from the editable cell
                foodData += foodId + ":" + gridRow['ServingsConsumed'] + ',';
            });
    
    0 讨论(0)
  • 2020-11-27 18:23

    In my case the contents of my cell is HTML as result of a formatter. I want the value inside anchor tag. By fetching the cell contents and then creating an element out of the html via jQuery I am able to then access the raw value by calling .text() on my newly created element.

    var cellContents = grid.getCell(rowid, 'ColNameHere');
    console.log($(cellContents)); 
    //in my case logs <h3><a href="#">The Value I'm After</a></h3>
    
    var cellRawValue = $(cellContents).text();
    console.log(cellRawValue); //outputs "The Value I'm After!"
    

    my answer is based on @LLQ answer, but since in my case my cellContents isn't an input I needed to use .text() instead of .val() to access the raw value so I thought I'd post this in case anyone else is looking for a way to access the raw value of a formatted jqGrid cell.

    0 讨论(0)
  • 2020-11-27 18:25

    My workaround is to attach an object containing orignal values to each tr element in the grid. I've used afterAddRecord callback to get my hands on the values before jqGrid throws them away and jQuery's "data" method to store them in the work.

    Example:

    afterInsertRow: function( rowid, rowdata, rowelem ) {
      var tr = $("#"+rowid);
      $(tr).data("jqgrid.record_data", rowelem);
    },
    

    “rowelem” is the array of cell values from our JSON data feed or [jsonReader] (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#jsonreader_as_function)

    Then at any point I can fetch those attributes using:

    $(tr).data(“jqgrid.record_data”).
    

    More at: http://wojciech.oxos.pl/post/9423083837/fetching-original-record-values-in-jqgrid

    0 讨论(0)
  • 2020-11-27 18:26

    I think that Aidan's answer is by far the best.

    $('#yourgrid').jqGrid("editCell", 0, 0, false);
    

    This commits any current edits, giving you access to the real value. I prefer it because:

    • You don't have to hard-code any cell references in.
      • It is particularly well suited to using getRowData() to get the entire grid, as it doesn't care which cell you've just been editing.
      • You're not trying to parse some markup generated by jqGrid which may change in future.
      • If the user is saving, then ending the edit session is likely the behaviour they would want anyway.
    0 讨论(0)
提交回复
热议问题