我的网络应用程序基于dojo 1.6.0。 我遇到的问题基本上是基于事件处理程序和/或它们的利用率 在dojos“dojox.grid.EnhancedGrid”库中。
我的应用程序包含一个带有大量行的dojox增强型网格。 (100 +)
此增强型网格使用“cellMenu”-Plugin来显示上下文菜单 右键单击每个网格单元格。
我的目标是使用上下文菜单“智能”选择行。
例如:
用户右键单击位于“lastname”列中的单元格,其值为“miller”。然后,他在上下文菜单中单击“智能选择”。 然后,应用程序将遍历行数据并选择所有具有“miller”作为“lastname”的行。 在此之后,用户将通过按下按钮来启动对所选行的操作。
这是一个小型源代码示例,演示了使用上下文菜单可视化增强型网格的声明式方法:
<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>
我对dojo相对较新,并且没有处理EnhancedGrid的经验。
所以我的问题如下:
当我在上下文菜单中单击“dijit.Menu”时出现“onClick”事件 其中包含的“dijit.MenuItem”被触发。
在这个事件处理程序中,我需要读取上下文菜单中“Grid Cell”的内容 打开了,但我没有(或者目前不知道)获得“Grid Cell”引用的方法。
使用默认策略我可以获得对MenuItem的引用,也可以从那里获得对Menu的引用,但是我无法找到包含对“Grid Cell”或行/列ID的引用的属性使我能够访问单击的单元格。
由于上下文菜单可以对“项目”执行某些操作,因此通过右键单击打开它们我认为必须有一种方式(如设计者所指)才能访问此“项目”。
我还没有找到说明这一点的文档或示例,非常感谢您的帮助。
答案 0 :(得分:1)
以下是在dojo网格上使用上下文菜单进行选择的可能的sollution(可能不是最好的):
视觉部分(陈述性)
<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>
答案 1 :(得分:0)
这将遍历网格中的所有选定项目,并获取名为“YourGridColumnName”的单元格的值。
var items = YourDataGridId.selection.getSelected();
if (items.length) {
dojo.forEach(items, function(selectedItem) {
alert(YourDataGridId.store.getValues(selectedItem, "YourGridColumnName"));
})
}
希望它有所帮助。
答案 2 :(得分:0)
您可以将事件处理程序链接到将显示上下文菜单的鼠标和键盘事件。该事件有一个行索引,您可以将其存储在菜单项将找到它的位置。