【问题标题】:Move focus from one to another itemRenderer inside DataGrid itemRenderer在 DataGrid itemRenderer 中将焦点从一个 itemRenderer 移到另一个 itemRenderer
【发布时间】:2012-08-17 16:21:34
【问题描述】:

我有一个 mx: DataGrid 有 4 列,其中 itemRenderer 具有以下设置:

Mx:DataGrid:

<mx:DataGrid id="itensPedidoCompraList"
             width="100%"
             height="120"    
             dataProvider="{ model.pedidoCompra.itens }"
             editable="true"
             itemEditEnd="itensPedidoCompraList_itemEditEndHandler(event)">

Mx:DataGridColumn:

<mx:DataGridColumn headerText="{resourceManager.getString('cadastroPedidoCompra', 'ident.PercentualDesconto') }"
               width="60"
               textAlign="right"
               rendererIsEditor="true"
               editorDataField="data">
  <mx:itemRenderer>
             <fx:Component>
                   <mx:Canvas>
                         <input:NumberInput width="55"   number="@{data.percentualDesconto }"/>
                   </mx:Canvas>
        </fx:Component>
  </mx:itemRenderer>

用户单击网格的行,然后单击要编辑的列。 在他更改或添加值之后,ENTER 键并且必须将焦点移动到同一行中的另一列。 我正在做的方式,正在移动到下面的列。

移动到右列的最佳方法是什么?

谢谢

【问题讨论】:

    标签: actionscript-3 apache-flex flex4 flex3 flex4.5


    【解决方案1】:

    请注意,DataGrid 在编辑行时具有以下功能:

    • Enter 接受编辑并将焦点移至下一行(如果editorUsesEnterKey 为真)
    • TABSHIFT-TAB 接受编辑并将焦点移至下一列/上一列
    • ESCCTRL-. 取消编辑,保留焦点

    您可以使用DataGridColumneditorUsesEnterKey 属性禁用Enter 键功能。

    <mx:DataGridColumn editorUsesEnterKey="false" />
    

    更改行为以使ENTER 将焦点向右/向左移动有点麻烦。击键处理在下面的私有方法中完成。这个监听器在DataGrid 的公共方法createItemEditor() 中添加并在destroyItemEditor() 中删除。从理论上讲,您可以重写这些方法来改变这种行为。

    源 mx::DataGrid(注意选项卡在关键焦点更改处理程序中处理)

     private function editorKeyDownHandler(event:KeyboardEvent):void
        {
            // ESC just kills the editor, no new data
            if (event.keyCode == Keyboard.ESCAPE)
            {
                endEdit(DataGridEventReason.CANCELLED);
            }
            else if (event.ctrlKey && event.charCode == 46)
            {   // Check for Ctrl-.
                endEdit(DataGridEventReason.CANCELLED);
            }
            else if (event.charCode == Keyboard.ENTER && event.keyCode != 229)
            {
                // multiline editors can take the enter key.
                if (!_editedItemPosition)
                    return;
    
                if (columns[_editedItemPosition.columnIndex].editorUsesEnterKey)
                    return;
    
                // Enter edits the item, moves down a row
                // The 229 keyCode is for IME compatability. When entering an IME expression,
                // the enter key is down, but the keyCode is 229 instead of the enter key code.
                // Thanks to Yukari for this little trick...
                if (endEdit(DataGridEventReason.NEW_ROW) && !dontEdit)
                    findNextEnterItemRenderer(event);
            }
        }
    

    【讨论】:

    • 它部分工作。添加了 editorUsesEnterKey = "true" 并在 itemEditEnd 我这样做: itensPedidoCompraList.editedItemPosition = {columnIndex:event.columnIndex + 1 , rowIndex:0};我的 itemRenderer 有一个 NumberInput 扩展 TextInput 的组件,当我执行 editItemPosition 时,他将焦点从 DataGrid 中抛出。仅当列而不是 itemRenderer 时才会获得焦点。
    • PS:或者仅仅依靠TAB 键水平移动焦点的事实。这实际上是非常标准的行为。您可以告诉您的客户,网格的行为类似于 Excel:当您按下 Enter 时,它会向下移动一行 :)
    • 我明白了。但要求并使用 Enter 键。甚至 Tab 键也不会移动到下一个 itemRenderer 并且不显示焦点。所以移动到另一个具有 TextInput 的 itemRenderer。我猜这与我扩展 TextInput 的自定义组件有关。如果你使用 TextInput 可以正常工作。
    • 是的,这听起来像扩展 TextInput 的自定义渲染器是 tab 键无法正常工作的原因。您可能想要创建一个新问题或/编辑这个问题并显示该渲染器的代码。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2011-11-03
    • 2012-08-21
    • 1970-01-01
    • 2010-11-18
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多