我有一个带有
selectionMode="multipleRows"
的 Spark 数据网格。
我的数据网格中有三列。
我不希望当用户的点击落在行的第三列时发生行选择。
仅当单击前两列之一时才会发生行选择。
我如何实现这一目标?数据网格有一个
selectionChanging
事件,但是处理程序中收到的 GridSelectionEvent
对象似乎没有提供有关发生单击的列的任何信息。
谢谢!
我自己发现了这一点。我不确定这是否是 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(); }
我意识到这不是一个干净的解决方案,但这是我能想到的最好的解决方案。也许有人可以提出更好的解决方案?
我知道它已经 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];
}
伟大的黑客,但它正在工作