Flex 4.5 Spark DataGrid - 检测在选择更改处理程序中单击的列

问题描述 投票:0回答:2

我有一个带有

selectionMode="multipleRows"
的 Spark 数据网格。

我的数据网格中有三列。

我不希望当用户的点击落在行的第三列时发生行选择。

仅当单击前两列之一时才会发生行选择。

我如何实现这一目标?数据网格有一个

selectionChanging
事件,但是处理程序中收到的
GridSelectionEvent
对象似乎没有提供有关发生单击的列的任何信息。

谢谢!

actionscript-3 apache-flex datagrid flex4.5 flex-spark
2个回答
0
投票

我自己发现了这一点。我不确定这是否是 Spark DataGrid 中的错误。以下内容绝对是黑客攻击且不干净。

grid_mouseDownHandler
文件中的
DataGrid.as
函数中,有一行:

const columnIndex:int = isCellSelection ? event.columnIndex : -1;

如果

columnIndex
-1
不是
selectionMode
DataGrid
,则此行会导致
GridSelectionMode.SINGLE_CELL
设置为
GridSelectionMode.MULTIPLE_CELLS
。正如我在原来的问题中提到的,我需要我的数据网格具有
selectionMode
GridSelectionMode.MULTIPLE_ROWS

我对 DataGrid 进行了子类化并重新实现了

grid_mouseDownHandler
(基本上是复制粘贴整个函数)。我仅更改了上面的行以始终将
columnIndex
分配给
event.columnIndex

(我还必须将

grid_mouseDownHandler
引用的更多函数复制到我的子类中,因为这些函数是 protected 或 mx_internal。(
toggleSelection
extendSelection
isAnchorSet

然后,在

selectionChanging
事件处理程序中,我可以执行以下操作:

if( 2 == event.selectionChange.columnIndex )
{
    event.preventDefault();
}

我意识到这不是一个干净的解决方案,但这是我能想到的最好的解决方案。也许有人可以提出更好的解决方案?


0
投票

我知道它已经 13 岁了,但我今天也遇到了同样的问题,我是怎么做的:

protected function dataGrid_itemClickHandler(e:GridSelectionEvent):void             {
            var mouseX:Number = dataGrid.mouseX;
            mouseX += dataGrid.scroller.horizontalScrollBar.value;
            var lastPosX:Number = 0;
            var posX:Number = 0;
            for (var i:int=0; i<dataGrid.columns.length; i++){
                posX += dataGrid.grid.getColumnWidth(i);
                if ((mouseX > lastPosX) && (mouseX< posX)){
                    break;
                }
                lastPosX += dataGrid.grid.getColumnWidth(i);
            }
            //now i is the column index cliqued
            var dc:GridColumn = dataGrid.columns[i];
}

伟大的黑客,但它正在工作

© www.soinside.com 2019 - 2024. All rights reserved.