我的 Flex 应用程序中有一个 Datagrid。
右键单击标题行时,我需要显示一个上下文菜单。单击其余数据网格项(包含数据的项)时,不得出现后一个上下文菜单。
编辑:应用程序在 AIR 环境中运行,所以我没有 Flash 播放器的麻烦
我的 Flex 应用程序中有一个 Datagrid。
右键单击标题行时,我需要显示一个上下文菜单。单击其余数据网格项(包含数据的项)时,不得出现后一个上下文菜单。
编辑:应用程序在 AIR 环境中运行,所以我没有 Flash 播放器的麻烦
下面的代码可以帮助你: -
我创建了一个示例,其中我只添加了一个项目。您可以根据需要对其进行转换和更改逻辑。我的想法是提供一种基本逻辑。你可能会得到更好的解决方案,但这对你有用。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<mx:DataGrid id="myDG" width="350">
<mx:dataProvider>
<mx:ArrayCollection>
<mx:source>
<fx:Object Artist="" Price="11.99"
Album="Slanted and Enchanted" />
<fx:Object Artist=""
Album="Brighten the Corners" Price="11.99" />
</mx:source>
</mx:ArrayCollection>
</mx:dataProvider>
<mx:columns>
<mx:DataGridColumn dataField="Artist" headerRenderer="StackLabelRenderer"/>
<mx:DataGridColumn dataField="Album" headerRenderer="StackLabelRenderer"/>
<mx:DataGridColumn id="price" dataField="Price" headerRenderer="StackLabelRenderer"/>
</mx:columns>
</mx:DataGrid>
</s:Application>
StackLabelRenderer.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Label xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
click="dispatchClickEvent()">
<fx:Script>
<![CDATA[
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.dataGridClasses.DataGridListData;
import mx.core.mx_internal;
private function dispatchClickEvent():void
{
trace("Item Clicked")
}
import mx.controls.Alert;
[Bindable]
private var cm:ContextMenu;
override protected function createChildren():void
{
cm = new ContextMenu();
cm.hideBuiltInItems();
cm.addEventListener(ContextMenuEvent.MENU_SELECT, contextMenu_menuSelect);
this.contextMenu = cm;
}
private function contextMenu_menuSelect(evt:ContextMenuEvent):void {
//condition to check length of column data length
var allNull:Boolean=true;
var columnName:String = DataGridColumn(data).headerText;
for each(var o:Object in DataGrid(owner).dataProvider) {
if(o[columnName] != "") {
allNull=false;
break;
}
}
if(!allNull)
{
var cmi:ContextMenuItem = new ContextMenuItem("First Element...", true);
cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, contextMenuItem_menuItemSelect);
cm.customItems = [cmi];
}
}
private function contextMenuItem_menuItemSelect(evt:ContextMenuEvent):void {
}
]]>
</fx:Script>
</mx:Label>
我不确定鼠标右键单击,cos flex 应用程序在 Flash 播放器中运行,然后右键单击会显示其菜单。最好的办法是在 DatagRid 上使用 headerRelease 事件。然后,在您的事件处理程序中,您可以创建菜单(可能在弹出窗口或某些悬停面板中?),然后在那里执行您需要执行的操作。在此处阅读有关它的更多信息
编辑:也许您可以使用 contextMenu 类,并将其附加到您的 dataGrid.contextMenu?
在 flex 中,更一般地在 flash 中,没有办法捕获右键单击事件。