2011-08-15 3 views
0

다중 선택 및 인라인 편집 기능을 갖춘 jqGrid 인스턴스가 있습니다. beforeSelectRow 이벤트에 몇 가지 코드를 작성하여 ctrl-key 및 shift-key를 사용하여 여러 선택을 수행 할 수 있습니다. 핫키를 누르지 않고도 단일 선택을 할 수 있습니다. 인라인 편집을 사용하려면 행을 두 번 선택하면 editRow으로 전화 할 것입니다. jqGrid 편집 가능한 행의 입력 필드에 초점을 맞추면 왜 행이 '선택 취소'됩니까?

  • '선택 드'를 얻기 위해 다른 행을 다시 선택한 후

    1. 편집 가능한 행의 모든 ​​필드의 입력 요소에 클릭이 행이 될 것 : 그러나, 나는이 이상한 문제에 들어가 편집 모드로 전환하면 대상 행에 restoreRow이 제대로 호출 되더라도 이전에 선택한 행을 복원 할 수 없습니다.

    --EDITED--

    , 행

    Select a row

    편집 모드

    Select a row again to get into edit mode

    초점을 입력 상자에 들어가 다시 행을 선택을 선택 행을 선택 취소합니다

    Focus the input box, will 'de-select' the row

    선택 & 편집 다른 행은, 이전 행 복원 할 수 없습니다.

    Select another row, the previous row can't be restored.

    - 코드 - 코드에서

     beforeSelectRow: function (rowid, e) { 
         var $this = $(this); 
         var url_for_save_edit = this.p.editurl; 
         var last_selected_row = this.p.selrow; 
         var cur_selected_rows = $this.data(key_selected_rows); 
    
         if (true == e.shiftKey) { 
          if (rowid != last_selected) { 
           var min = parseInt((rowid < last_selected_row) ? rowid : last_selected_row); 
           var max = parseInt((rowid > last_selected_row) ? rowid : last_selected_row); 
           for (var i = min + 1; i < max; i++) { 
            $this.jqGrid(method_setSelection, i, false); 
           } 
          } 
         } else if (false == e.ctrlKey) { 
          $this.resetSelection(); 
    
          if (!$.string.isNullOrEmpty(url_for_save_edit)) { 
           if (!$.isNull(cur_selected_rows) && (cur_selected_rows.length <= 1) && (rowid == last_selected_row)) { 
            var curr_edit_row = $this.data(key_curr_edit_row); 
            console.log('>>>>> curr selected rows = ', cur_selected_rows, ', last selected row = ', last_selected_row, 'curr editing row = ', curr_edit_row, ', to be editable row: ', rowid); 
            if (rowid != curr_edit_row) { 
             if (!$.isNull(curr_edit_row)) { 
              console.log('>>>>> restoring row ', curr_edit_row); 
              $this.jqGrid('restoreRow', curr_edit_row, null); 
             } 
             console.log('>>>>> set row as editable: ', rowid); 
             $this.jqGrid('editRow', rowid, false, null, null, null, null, null, null, null); 
             $this.data(key_curr_edit_row, rowid); 
            } 
           } 
          } 
         } 
         return true; 
        } 
    
  • 답변

    0

    당신은 행 (if (true == e.shiftKey) 참조) 오름차순 순서에 ROWID에 의해 를 분류되어 있음을 가정합니다. 나는 당신이 더 나은 sortnamesortorder jqGrid의 매개 변수를 사용해야한다고 생각합니다. Morover를 사용하면 jQuery.next 또는 jQuery.prev을 사용하여 다음 또는 이전 <tr> 요소로 이동할 수 있습니다.

    또한 this.p.selarrrow 대신 $this.data(key_selected_rows)을 사용하는 이유를 알지 못합니다.

    미안하지만, 나는 프로그램을 다시 작성하고 <tr> (그리드 행) 및 <table> 요소를 더 DOM 속성을 사용하는 당신에게 를 추천 할 것입니다. 예를 들어 rowIndex 속성이 <tr> 일 경우 요소의 rows 컬렉션에있는 행의 색인을 제공 할 수 있습니다. this.rows[index+1] 또는 this.rows[index+1] (<table> 요소의 DOM 표현을 가리키는 beforeSelectRow에있는 this)을 사용하여 다음/이전 행을 가져올 수 있습니다.

    주된 질문 : 어떤 상황에서 행 선택 또는 선택 취소를 방지하려면 beforeSelectRow에서 false을 반환해야합니다.

    +0

    안녕하세요 올렉. jqGrid 문서 만 따랐기 때문에 소스 코드에 익숙하지 않습니다.또한 DOM에 직접 액세스하는 대신 API를 사용하고 싶습니다. 문제는 정말 이상합니다. 일단 삽입 된 입력 상자에 초점이 맞춰지면, 원래 선택한 행은 '선택 해제'됩니다. 너는 어떤 생각을 가지고 있니? GitHub에서 jqGrid 소스 코드를 추적했지만 찾지 못했습니다. –

    +0

    @William Choi : 죄송 합니다만'this.p.selrow'를 직접 사용하십시오. 왜'this.p.selarrrow'를 쓰지 않고 대신'$ this.data (key_selected_rows)'를 사용합니까? undefined'$ .string.isNullOrEmpty'를 사용합니다. if (! $. string.isNullOrEmpty (url_for_save_edit))'는 단지'if (url_for_save_edit)'여야합니다. 'this.rows'의 사용법은'this.p'처럼 간단하지만 모든 표준 **에 해당하므로'this.p'로 훨씬 더 확실하게 사용할 수 있습니다. 'this.rows'는 jqGrid의 일부가 아니며 DOM 표준의 일부입니다. jqGrid에는 기존 DOM 속성에 대한 API가 없습니다. 나는 당신의 코드를 테스트하고 더 많이 쓰려고 노력할 것이다. – Oleg

    +0

    '$ .string.isNullOrEmpty'는 그냥 내 인생을 단순화하기위한 util 메서드입니다. –

    관련 문제