2015-11-16 2 views
1

Как мы можем разрешить пользователям выбирать только одну строку для каждой группы?jqgrid выбрать только одну строку в группе

У меня есть следующий код.

var data = [ 
      { ActionItemId: "AAZ08702-0001104", StrarTime: "2007-10-01", Category: "General", CategoryDetails: "dummy text of industry. a galley of type ", TargetCategory: "200.00", 
      TargetDateCategory: "10.00", ActualCategory: "210.00"} 
     ]; 

     $("#jqGrid").jqGrid({ 
      data: data, 
      datatype: "local", 
      colModel: [ 
       { label: 'Action Item ID', name: 'ActionItemId', key: true }, 
       { label: 'Start Time', name: 'StrarTime'}, 
       { label: 'Category', name: 'Category'}, 
       { label: 'Details', name: 'CategoryDetails', cellattr: function (rowId, tv, rawObject, cm, rdata) { return 'style="white-space: normal;"' }}, 
       { label: 'Target <Category>', name: 'TargetCategory' }, 
       { label: 'Target Date <Category>', name: 'TargetDateCategory'} 
      ], 
      loadonce: true, 
      viewrecords: true, 
      //width: 1000, 
      height: 400, 
      rowNum: 20, 
      rowList: [20, 30, 50], 
      rownumbers: true, 
      rownumWidth: 25, 
      multiselect: true, 
      shrinkToFit: false, 
      pager: "#jqGridPager", 
      grouping: true, 
      groupingView: { 
       groupField: ["Category"], 
       groupColumnShow: [true], 
       groupText: ["Category: <b>{0}</b>"], 
       groupOrder: ["asc"], 
       groupSummary: [false], 
       groupCollapse: false 

      } 
     }); 

Мне нужно отключить возможность выбора нескольких строк на столбец. Является ли это возможным?

Есть ли настройка в функции группировки, которая будет работать в качестве требования к mu? или он должен быть специально разработан?

Примечания: Я только добавил один столбец, чтобы избежать очень длинный кода в вопросе

+1

Извините, но для меня не совсем понятно, какое поведение вам нужно реализовать. Позвольте пользователю выбрать строку. Вы хотите отказать в выборе, если другая строка из той же группы уже выбрана или вы хотите отменить выбор ранее выбранной строки (из той же группы) и выбрать текущую строку? – Oleg

+0

Первый вариант, который вы упомянули. пример: пользователь выбирает строку, он больше не может выбирать строки из той же группы, но он может выбирать строки из других групп. видимо, пользователь может выбрать только одну строку из каждой группы – ChathuraSam

+0

, вы можете использовать обратный вызов 'beforeSelectRow', чтобы запретить выбор любой строки. Внутри обратного вызова 'beforeSelectRow' вы можете протестировать любые ваши пользовательские критерии и вернуть' false', чтобы запретить выбор или вернуть 'true', чтобы разрешить выбор. В зависимости от версии jqGrid, которую вы используете, может потребоваться снять флажок многоселектора только в том случае, если пользователь щелкнул * напрямую * на флажке. Существуют различные способы проверки того, находится ли уже выбранная строка (из 'selarrrow') в той же группе, что и в текущий момент. В случае использования небольшого размера страницы ('selarrrow') любой способ в порядке. – Oleg

ответ

1

Одним из возможных реализаций могут быть добавлением add обратных вызова, которые возвращают false, если другая строка из тех же групп уже выбрана. Пример реализации заключается в следующем:

beforeSelectRow: function (rowid, e) { 
    var selarrrow = $(this).jqGrid("getGridParam", "selarrrow"), 
     $tr = $(e.target).closest("tr.jqgrow"), 
     otherIdsOfTheGroup; 

    if ($tr.length > 0) { 
     otherIdsOfTheGroup = 
      // get all rows of the group before the current 
      $tr.prevUntil("tr.jqgroup") 
       // add all rows of the group after the current 
       .add($tr.nextUntil("tr.jqgroup")) 
       // enum all the rows of the group without the current 
       .map(function() { 
        // test whether the rowid is already selected 
        if ($.inArray(this.id, selarrrow) >= 0) { 
         // add the rowid to the array of returned values 
         return this.id; 
        } 
       }); 
     // otherIdsOfTheGroup contains the array of rowids of the rows 
     // from the same group, which are already selected 
     if (otherIdsOfTheGroup.length > 0) { 
      return false; // prevent selection 
     } 
    } 
    return true; // allow selection 
} 

См the demo

ОБНОВЛЕНО: можно легко модифицировать aboce Vode к невыбранного ранее выбранных строк из той же группы. Нужно просто позвонить resetSelection для каждого ROWID из otherIdsOfTheGroup массива и возвращает истину от otherIdsOfTheGroup разрешить выбор:

beforeSelectRow: function (rowid, e) { 
    var $this = $(this), 
     selarrrow = $this.jqGrid("getGridParam", "selarrrow"), 
     $tr = $(e.target).closest("tr.jqgrow"), 
     otherIdsOfTheGroup; 

    if ($tr.length > 0) { 
     otherIdsOfTheGroup = 
      // get all rows of the group before the current 
      $tr.prevUntil("tr.jqgroup") 
       // add all rows of the group after the current 
       .add($tr.nextUntil("tr.jqgroup")) 
       // enum all the rows of the group without the current 
       .map(function() { 
        // test whether the rowid is already selected 
        if ($.inArray(this.id, selarrrow) >= 0) { 
         // add the rowid to the array of returned values 
         return this.id; 
        } 
       }); 
     // otherIdsOfTheGroup contains the array of rowids of the rows 
     // from the same group, which are already selected 
     if (otherIdsOfTheGroup.length > 0) { 
      $.each(otherIdsOfTheGroup, function() { 
       $this.jqGrid("resetSelection", this); 
      }); 
     } 
    } 
    return true; // allow selection 
} 

См the next demo. Я включил скрытие заголовка столбца кнопки «Выбрать все», чтобы написать меньше кода. Вы можете реализовать ответный вызов onSelectAll и разрешить выбирать только одну (например, первую) строку из каждой группы.

+0

Большое спасибо за этот код. Я также попытался решить эту проблему с помощью метода ** beforeSelectRow **. Я опубликую решение в качестве ответа. Вопросы, которые я нашел В вашем решении пользователь не может сразу выбрать другую строку из той же группы (пользователь должен отключить текущую строку и выбрать другую строку) в моем решении пользователь не может отменить выбор вообще. поэтому он работает как набор переключателей. Я думаю, что это недостатки двух решений, которые у нас есть – ChathuraSam

+1

@ChathuraSam: Добро пожаловать! Я спросил вас о точном поведении, которое вам нужно реализовать в своем первом комментарии к вашему вопросу. Вы отвечаете: «1-й вариант», что означает «отклонить выбор, если другая строка из той же группы уже выбрана». Таким образом, я реализовал свое поведение. В любом случае очень легко изменить поведение. Можно просто заменить строку 'return false; 'моего кода на вызов' resetSelection' для всех строк той же группы, которая уже выбрана. См. ** ОБНОВЛЕНО ** часть моего ответа. – Oleg

+0

wow awesome. Большое спасибо за предоставленную помощь. вы спасатель жизни! – ChathuraSam

0

Мне удалось решить эту проблему, используя следующий код.

 beforeSelectRow: function (id, e) { 
      var rowdata = $("#jqGrid").getRowData(id); 
      var category = rowdata.Category; 
      var selectedRowTR = $("#jqGrid").find("tr[id='" + id + "']"); 
      var groupTRs = $("#jqGrid").find("tbody> tr.jqgrow > td[title='" + category + "']").parents("tr"); 

      var ids = groupTRs.map(function() { 
       return this.id; 
      }).get(); 

      var selectedIDs = $("#jqGrid").getGridParam("selarrrow"); 

      var commonValues = []; 
      var i, j; 
      var arr1Length = ids.length; 
      var arr2Length = selectedIDs.length; 

      for (i = 0; i < arr1Length; i++) { 
       for (j = 0; j < arr2Length; j++) { 
        if (ids[i] === selectedIDs[j]) { 
         commonValues.push(ids[i]); 
        } 
       } 
      } 

      for (var i = 0; i < commonValues.length; i++) { 
       $("#jqGrid").jqGrid('setSelection', commonValues[i], false); 

      } 

     return true; 
    }, 

rowdata.Category; это переменная, сгруппированная по таблице. Единственная проблема заключается в том, что пользователь не может отменить то, что он/она уже выбрал в группе. поэтому он работает как набор переключателей. Но это работает для моего требования. Надеемся, что мы сможем улучшить это и ввести поведение радиоприемников для группировки в jqgrid. Спасибо всем.

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