2011-08-25 50 views
0

我的web應用程序基於dojo 1.6.0。 我有的問題是基於事件處理程序基本上和/或他們在dojos「dojox.grid.EnhancedGrid」庫中使用 。如何從單元格上下文菜單訪問(增強)網格單元格數據?

我的應用程序包含具有大量行的dojox增強型網格。 (100+)

此增強型網格利用「cellMenu」 - 插件爲右鍵單擊每個網格單元顯示上下文菜單 。

我的目標是使用上下文菜單進行「智能」選擇行。

例如:

用戶右點擊一個細胞至極被定位在列「姓氏」和具有值「米勒」。然後,他在上下文菜單中單擊「智能選擇」。 然後,應用程序將遍歷行數據並選擇「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-文件:

<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比較陌生,沒有處理增強網格的經驗。

所以我的問題是這樣的:

當我點擊上下文菜單這是一個「dijit.Menu」的「點擊」所載觸發「dijit.MenuItem」的事件 內。

在這個事件處理程序中,我需要讀取「Grid Cell」的內容,上下文菜單 已打開,但我沒有(或不知道)一種方法來獲取對「Grid細胞」。

使用默認策略,我可能能夠獲得對MenuItem的引用,並從那裏可能到Menu,但我無法找到包含對「Grid Cell」或行/列ID引用的屬性將使我能夠訪問單擊的單元格。

由於上下文菜單是通過「右鍵單擊」打開的「項目」,我認爲必須有一種方法(如設計者所說)來訪問此「項目」。

我還沒有找到說明這一點的文檔或例子,並希望得到您的幫助。

+0

我認爲奇怪的是,上下文菜單的menuitem click事件沒有內置引用單擊的元素。上下文菜單的重點是什麼 - 特別是增強型網格的單元格上下文菜單 - 如果它與單元格無關? – elfwyn

回答

1

這裏是一個可能的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> 
0

這將通過網格中的所有選定項目並獲取名爲「YourGridColumnName」的單元格的值。

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

希望它有幫助。

+0

不幸的是,列名是我無法檢索的那些東西之一。另外,右鍵單擊的單元格(對於上下文菜單)未被選中。我的目標是從右鍵單元格中檢索值,並根據上下文菜單中的用戶選擇選擇具有相似條目的行。 – elfwyn

+0

我會使用_dojox.grid.DataGrid_並使用_onRowContextMenu_事件而不是增強的數據網格。 – drcelus

+0

此提示將我引向EnhancedGrid的onCellContextMenu。這可能是我迄今爲止遺漏的難題。 – elfwyn

0

您可以將一個事件處理程序鏈接到鼠標和鍵盤事件中,這將引發上下文菜單。該事件有一個行索引,您可以將其存儲在菜單項可以找到的位置。

+0

現在我只進入dojo事件處理的基礎知識。如何將「連接」到現有的事件連接中,或者是否指獨立於現有「菜單打開事件」的並行事件連接?你將如何存儲值以允許菜單項訪問它 - 我可能只是使用全局變量,這對我來說看起來並不是很優雅。 – elfwyn

+0

儘管drcelus和他的評論給了我最後的想法,但這個答案最接近我最後實施的溶劑。 – elfwyn