0

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

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

编辑:应用程序在 AIR 环境中运行,所以我没有 Flash 播放器的麻烦

4

3 回答 3

0

下面的代码可以帮助你: -

我创建了一个示例,其中我只添加了一个项目。您可以根据需要对其进行转换和更改逻辑。我的想法是提供一种基本逻辑。你可能会得到更好的解决方案,但这对你有用。

   <?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>
于 2012-08-21T10:46:45.053 回答
0

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

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

于 2012-08-21T09:37:24.810 回答
0

在 flex 中,更一般地在 flash 中,没有办法捕获右键单击事件。

于 2012-08-21T09:47:36.817 回答