2012-02-04 5 views
14

로드 할 때 jqgrid의 셀을 영구적으로 업데이트하려고합니다. setCell을 사용할 수 있지만 해당 페이지의 값만 업데이트한다는 것을 알고 있습니다. 셀에 다른 setCell을 명시 적으로 수행하지 않으면 다시 페이지로 돌아 오면 이전 값이 표시됩니다. 또한 setRowData 시도했지만 동일한 일을 것으로 보인다. 난 내 접근 방식으로 loadonce을 사용하고 있습니다 1) 데이터를로드 2) 일부 기준에 따라 데이터의 몇 가지 값을 수정 3) 수정 된 값을 표시합니다. loadonce을 사용하고 있으므로이 세션에서 영구적으로 셀을 수정하는 방법이 없어야합니까?jqgrid에서 데이터 값을 업데이트하는 방법

UPDATE :

오류를 포기하지 않는 내 코드에서 퍼팅하지만 모든 데이터를 반복 실패 :

var set = 0; 

.... 

gridComplete: function(data){ 
    setData(); 
}, 

.... 

beforeRefresh: function(data){ 
    set = 0; 
}, 

.... 

function setData(){ 

if(set == 1) return; 
... //create hash up here 
    var dataArray = jQuery("#grid").jqGrid('getGridParam', 'data'); 
    var j = 1; 
    for (var rows in dataArray) { 
    var key = dataArray[rows].name; 
    dataArray[rows].level = hashTable[key]; 
    j++; 
    } 
    alert(j); 
} 

이 로컬로드 된 배열의 모든 항목을 통해 순환되지 않는다 . 예를 들어, 페이지 크기를 30으로 설정하면 alert(j)은 로컬로로드 한 항목 수에 관계없이 30을 반환합니다. 그러나 그래프를 새로 고치면 j가 올바른 숫자입니다. 각각의 경우에 getGridParam의 동작이 다른 이유는 무엇입니까?

답변

30

loadonce: true을 사용하는 경우 을 알아야합니다. 여기서 로컬 데이터는 jqGrid가 보유합니다. jqGrid에는 data_index의 두 가지 옵션이 있습니다. data은 모든 항목의 이름이 name이고 속성이 colModel 인 항목의 배열입니다. id (rowid)로 항목을 찾아야하는 경우 배열의 rowid가있는 항목에 _index[rowid]을 사용할 수 있습니다. 그래서 열에서 데이터를 변경하는 'myColumn' 다음을 수행해야합니다

// first change the cell in the visible part of grid 
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue); 

// now change the internal local data 
var dataArray = myGrid.jqGrid('getGridParam', 'data'), 
    indexes = myGrid.jqGrid('getGridParam', '_index'); 
dataArray[indexes[rowid]].myColumn = newValue; 

업데이트] : 여기 온 모든 사람들을 위해

// first change the cell in the visible part of grid 
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue); 

// now change the internal local data 
myGrid.jqGrid('getLocalRow', rowid).myColumn = newValue; 
+0

죄송하지만이 점을 완전히 이해하지 못했습니다. 'dataArray [indexes [rowid]]. myColumn을 어떻게 수행합니까? personName이라는 열의 정확한 코드는 다음과 같습니다. dataArray [indexes [rowid]]. 'personName'? 그 때문에 오류가 발생했습니다. 또한 setCell을 호출해야하는 이유는 무엇입니까? 데이터 배열을 실제로 수정하고 있다면 데이터의 렌더링이 새 값을 표시하지 않을까요? – WildBill

+0

또한 코드에서 'setCell'을 호출 한 다음 데이터 배열을 수정한다고 말합니다. 데이터 배열은 setCell이 작동하는 셀보다 훨씬 커야합니다. 맞습니까? 더 이상 페이지를 순환하거나, 정렬하거나 필터링 할 때마다 setCell을 호출 할 필요가 없습니다. – WildBill

+2

@WildBill :'dataArray [indexes [rowid]]. personName' 또는'dataArray [indexes [rowid]] [ 'personName']'는 내부 데이터를 변경하지만'' 그리드의 요소 내부 데이터를 수정하고'trigger ('reloadGrid')를 호출 할 수 있지만'setCell'의 사용법은 그리드를 완전히 다시로드하는 것보다 낫습니다. – Oleg

0

: 로컬 데이터를 변경하는 문서화 된 getLocalRow 방법을 사용할 수 있습니다 구글에서, 여기에 업데이트 된 답변입니다!

중요한 것은 getInd-Method를 호출하여 얻을 수있는 색인입니다. RowID! = localRowData의 인덱스 때문입니다. (EQ ROWID :. jqg204, 인덱스 : 5)

편집 : "키 : true"로 설정 경우 colmodel에 내 예 "jqg ###"에서 일반적으로 PK에서 자신의 ROWID (diffrent을 설정할 수 있습니다 데이터베이스 테이블)

var ind = myGrid.getInd(rowId); 
var localRowData = myGrid.jqGrid('getLocalRow', ind); 
localRowData.myColumn = newValue; 

희망이 있습니다!

0

비슷한 문제가 있습니다.
특정 사용자 작업 (관련 없음)에 따라 행을 업데이트해야했습니다.
이를 위해 필자는 테이블을 필터링 한 후에도 'data'개체에서 정확한 행을 알아야했습니다. 포맷터 코드, 지금

loadComplete: function() { 
      if (firstRun) { 
       firstRun = false; 
       var dataArray = $('#jqGrid').jqGrid('getGridParam', 'data'); 
       $(dataArray).each(function (index) { 
        dataArray[index].RowID = index + 1; 
       }); 
      } 
     } 

그리고 : 나는 'loadComplete'행사는 '데이터'개체의 각 항목에 대한 ROWID 속성을 추가 -
그래서 내가 변경 한 행을 식별하는 방법을 발견 , rData에 액세스 할 수있었습니다.작업이 수행 된 정확한 행을 식별하고 '데이터'표현을 가져 오거나 설정하는 RowID

관련 문제