【问题标题】:Flex datagrid header row right clickFlex数据网格标题行右键单击
【发布时间】:2012-08-16 15:01:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: apache-flex datagrid air header right-click


    【解决方案1】:

    在 flex 中,更普遍的是在 flash 中,没有办法捕捉右键单击事件。

    【讨论】:

    • 抱歉,我的帖子没有说清楚。我的应用在 AIR 环境中运行。
    • 我不确定这是不是真的,我记得创建了一个 DataGrid(在闪存中),可以使用右键单击复制其中的行。即使在 Flash 中,您也可以将项目添加到右键菜单。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,我可以...但是当我单击数据网格的每一行时会出现上下文菜单。我需要在点击标题行时让它出现
    • 好吧,我不了解 AIR,但在 flex 中,我会监听 headerRelease 事件,并在其处理程序调用/创建一个弹出菜单,其中包含您需要在网格上执行的选项。也许你可以做类似的事情?对类似事件做出反应?抱歉,我无法提供更多帮助。
    【解决方案3】:

    以下代码可能对您有所帮助:-

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      相关资源
      最近更新 更多