右键单击Flex数据网格标题行

时间:2012-08-21 09:29:00

标签: flex datagrid air header right-click

我的Flex应用程序中有一个Datagrid。

右键单击标题行时,我需要显示上下文菜单。 当单击其余的datagrid项(包含数据的项)时,不得出现后一个上下文菜单。

编辑:应用程序在AIR环境中运行,因此我没有闪存播放器问题

3 个答案:

答案 0 :(得分:0)

我不确定鼠标右键单击,在Flash播放器中运行cos flex应用程序,右键单击会显示其菜单。 最好的办法是在DatagRid上使用headerRelease事件。在您的事件处理程序中,您可以创建菜单(可能在弹出窗口或某个悬停面板中?),然后执行您需要在那里执行的操作。 详细了解here

编辑: 也许你可以使用contextMenu类,并将它附加到你的dataGrid.contextMenu?

答案 1 :(得分:0)

在flex中,更常见的是在flash中,没有办法捕获右键单击事件。

答案 2 :(得分:0)

以下代码可以帮助您: -

我创建的样本中只添加了一个ITEM。您可以根据需要转换它并更改逻辑。我的想法是提供一个基本逻辑。你可能会有更好的解决方案,但这对你有用。

   <?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>