如何让数据网格表现得像 ctrl 键处于活动状态?

Posted

技术标签:

【中文标题】如何让数据网格表现得像 ctrl 键处于活动状态?【英文标题】:How can I get a datagrid to behave like the ctrl key is active? 【发布时间】:2011-01-21 15:03:19 【问题描述】:

我希望我的数据网格在默认情况下表现得就像用户按住控制键一样。因此,当单击一个项目时,另一个项目它们都是选择的一部分,再次单击它们会将它们从选择中删除。

我已经有了allowMultipleSelection = true,但我似乎找不到任何可以做到这一点的设置。与此同时,我正在处理 itemclick 事件,但似乎我缺少一个易于使用的设置。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以尝试将事件侦听器添加到具有最高优先级的 MouseEvents(UP 和/或 DOWN)的网格中,停止传播,并重新调度具有与原始 event.target 相同属性的新 MouseEvent,但这次使用 ctrlKey=真的。

我不确定它是否会导致其他 10,000 件东西损坏。

【讨论】:

【参考方案2】:

我尝试了 Nalandial 的想法,但没有运气......无法真正拦截这些事件,但它让我朝着正确的方向前进。在这方面做了很多工作,然后发现解决方案比我做的要简单得多。我只需要扩展 dataGrid 类并覆盖两个函数(mouseDownHandler 和 mouseClickHandler),在那里添加 ctrlKey = true 然后调用函数的其余部分就可以完美地工作。如果你想实现它,下面是代码:

package com
    import flash.events.MouseEvent;
    import mx.controls.DataGrid;

    public class ForceCtrlDataGrid extends DataGrid
        public function ForceCtrlDataGrid()
            super();
        
        override protected function mouseClickHandler(event:MouseEvent):void
            event.ctrlKey = true;
            super.mouseClickHandler(event);
        
        override protected function mouseDownHandler(event:MouseEvent):void
            event.ctrlKey = true;
            super.mouseDownHandler(event);
        
    

【讨论】:

【参考方案3】:

您也可以像这样扩展 DataGrid 并覆盖 selectItem 方法:

override protected function selectItem(item:IListItemRenderer, shiftKey:Boolean, ctrlKey:Boolean, transition:Boolean = true):Boolean

    return super.selectItem(item, shiftKey, true, transition )

代码更少,对可能正在侦听该 MouseEvent 的其他元素产生影响的可能性更小。

【讨论】:

以上是关于如何让数据网格表现得像 ctrl 键处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中获取箭头键并在键盘上输入键以表现得像 Windows 7

如何让 list_blob 表现得像 gsutil

Python Enum:如何让枚举成员表现得像零一样?

ExtJS 3 DataGrid:如何使标题菜单中的最后一个检查项处于非活动状态

如何让我的应用程序表现得像我正在使用 Swift 在运行时更改 Application is agent(UIElement)?

让 Airflow 表现得像 Luigi:如果任务的输出只需要获得一次,如何防止任务在 DAG 的未来运行中重新运行?