Как получить доступ к (расширенным) данным ячейки сетки из контекстного меню ячейки? - PullRequest
0 голосов
/ 25 августа 2011

мое веб-приложение основано на dojo 1.6.0.Проблема, которая у меня есть, основана на основном обработчиках событий и / или их использовании в библиотеке dojos "dojox.grid.EnhancedGrid".

Мое приложение содержит расширенную сетку dojox с большим количеством строк.(100 +)

В этой расширенной сетке используется плагин cellMenu для отображения контекстного меню для каждой ячейки сетки при щелчке правой кнопкой мыши.

Моя цель - использовать контекстное меню для«умный» выбор строк.

Например:

Пользователь щелкает правой кнопкой мыши по ячейке, которая расположена в столбце «фамилия» и имеет значение «miller».Затем он нажимает «умный выбор» в контекстном меню.Затем приложение будет перебирать данные строк и выбирать все строки, которые имеют «miller» в качестве «фамилии».После этого пользователь будет инициировать действия с выбранными строками нажатием кнопки.

Вот небольшой пример исходного кода, иллюстрирующий декларативный подход для визуализации расширенной сетки с контекстным меню:

<table dojoType="dojox.grid.EnhancedGrid" plugins="{cellMenu:'myMenu'}">
<div id="myMenu" dojoType="dijit.Menu">
  <div id="mi1" dojoType="dijit.MenuItem">Do something with this cell</div>
  <div id="mi2" dojoType="dijit.MenuItem">Do something else with this cell</div>
</div>
<thead>
  definition of columns
</thead>
</table>

Код действия обрабатывается отдельно от визуализации в js-Files:

<script type="text/javascript">
dojo.addOnLoad(function(){
  dojo.connect(dijit.byId('mi1'),'onClick',function(event){ 
    //Use Data from the cell clicked to do something
  });
  dojo.connect(dijit.byId('mi2'),'onClick',function(event){
    //Use Data from the cell clicked to do something else
  });
});
</script>

Я относительно новичок в додзё и не имею опыта работы с EnhancedGrid.

ИтакМоя проблема заключается в следующем:

Когда я щелкаю внутри контекстного меню, которое является «dijit.Menu», запускается событие «onClick» содержащегося в нем «dijit.MenuItem».

Внутри этого обработчика событий мне нужно прочитать содержимое «ячейки сетки», в которой было открыто контекстное меню, но у меня нет (или в настоящее время не знаю) способа получить ссылку на «ячейку сетки».

При использовании тактики по умолчанию я мог бы получить ссылку на MenuItem и оттуда, возможно, на Menu, но мне не удалось найти атрибут coсодержит ссылку на «ячейку сетки» или идентификатор строки / столбца, который позволил бы мне получить доступ к ячейке, по которой щелкнули.

Поскольку контекстные меню существуют для того, чтобы что-то делать с «элементом», с которым они были открыты по правуНажав, я думаю, что должен быть способ (по замыслу дизайнера) получить доступ к этому «элементу».

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

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Вот возможное решение (возможно, не самое лучшее) для использования контекстного меню в сетке додзё для целей выбора:

Визуальная часть (декларативная)

<table id="grid" dojoType="dojox.grid.EnhancedGrid"
  plugins="{indirectSelection:true,menus:{cellMenu:'GridCellMenu'}}">
  <div dojoType="dijit.Menu" id="GridCellMenu" style="display:none;">
    <div dojoType="dijit.MenuItem" id="mi_selectSimilar">select similar items</div>
    <div dojoType="dijit.MenuItem" id="mi_deSelectSimilar">DEselect similar items</div>
  </div>
  <thead>
    <tr>
      <th field="id">ID</th>
      <th field="lastname">Lastname</th>
      <th field="firstname>firstname</th>
    </tr>
  </thead>
</table>

Фон JavaScript

// Stylesheets and Dojo Groundwork are neglected in this example

<script type="text/javascript">
  dojo.require('dijit.Menu');
  dojo.require('dijit.MenuItem');
  dojo.require('dojox.grid.EnhancedGrid');
  dojo.require('dojox.grid.enhanced.plugins.IndirectSelection');
  dojo.require('dojox.grid.enhanced.plugins.Menu');

  var currentEvent = null;

  var fn_selectSimilar = function(){
    var data = currentCell.grid.store.objectStore.data;
    dojo.forEach(data,function(row,idx){
      if(row[currentEvent.cell.field] == data[currentEvent.rowIndex][currentEvent.cell.field]){
        currentEvent.cell.grid.selection.addToSelection(idx);
      }
    }
  }
  var fn_deSelectSimilar = function(){
    var data = currentEvent.cell.grid.store.objectStore.data;
    dojo.forEach(data,function(row,idx){
      if(row[currentEvent.cell.field] == data[currentEvent.rowIndex][currentEvent.cell.field]){
        currentEvent.cell.grid.selection.deselect(idx);
      }
    }
  }

  dojo.addOnLoad(function(){
    dojo.connect(dijit.byId('grid'),"onCellContextMenu",function(e){
      currentEvent = e;
    });
    dojo.connect(dijit.byId('mi_selectSimilar'),"onClick",fn_selectSimilar);
    dojo.connect(dijit.byId('mi_deSelectSimilar'),"onClick",fn_deSelectSimilar);
  });

</script>
0 голосов
/ 31 августа 2011

Вы можете связать обработчик событий с событиями мыши и клавиатуры, которые вызовут контекстное меню. Событие имеет индекс строки, который можно сохранить в месте, где его найдет пункт меню.

0 голосов
/ 26 августа 2011

Это будет проходить через все выбранные элементы в сетке и получит значение ячейки с именем «YourGridColumnName».

var items = YourDataGridId.selection.getSelected();
if (items.length) {
    dojo.forEach(items, function(selectedItem) {
        alert(YourDataGridId.store.getValues(selectedItem, "YourGridColumnName"));
    })
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...