2011-01-08 5 views
0

Ich habe eine DataGrid, die eine MXDataGridItemRenderer als itemEditor auf eine der Spalten angewendet hat. Der Editor enthält eine spark.components.TextArea Kontrolle.Flex: Zeilenumbruch-Problem mit spark.components.TextArea in einem MXDataGridItemRenderer

Standardmäßig schließt sich ein Texteditor eines Datagrids, wenn die [enter] -Taste gedrückt wird. Dies wird im Hinterkopf behalten. Was ich tun möchte, ist:

  1. Prevent-Editor aus dem Schließen auf [SHIFT + ENTER] -Taste, sondern nehmen die Zeilenumbrüche (Ich kann dies tun, siehe Code unten)
  2. Schließen Sie den Editor auf [ENTER], aber nicht die Zeilenumbrüche akzeptieren (könnte dies nicht erreichen)

Hier wird der aktuelle Code ist in der MXDataGridItemRenderer:

<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" 
         focusEnabled="true" 
         > 
<fx:Script> 
    <![CDATA[ 
     protected function onTxtDataKeyDown(event:KeyboardEvent):void 
     { 
      if (event.keyCode == 13) 
      { 
       if (event.shiftKey) 
       { 
        //Prevent editor from closing on [SHIFT+ENTER] key but accept the linebreak 
        event.stopImmediatePropagation(); // » works 
       } 
       else 
       { 
        //Close the editor on [ENTER] key but do not accept the linebreak 
        event.preventDefault(); // » does not work 
       } 
      } 
     } 

    ]]> 
</fx:Script> 

<s:TextArea id="txtData" paddingTop="3" lineBreak="explicit" 
      text="{dataGridListData.label}" 
      verticalScrollPolicy="auto" horizontalScrollPolicy="off" 
      keyDown="onTxtDataKeyDown(event)" 
      /> 

Ich habe auch das textInput Ereignis versucht, aber das hat nicht den Trick gemacht. Also: Wie kann ich die linebreak verhindern, wenn der Editor geschlossen ist [enter] -Taste?

Jede Hilfe wird geschätzt. Vielen Dank.

EDIT: Wenn ich die spark.components.TextArea zu mx.controls.TextArea, zweiter Teil mit event.preventDefault() verändern wird wie erwartet, aber dann der erste Teil, in der SHIFT + ENTER nimmt die Zeilenumbrüche nicht funktionieren.

Antwort

1

Gemäß der API-Referenz keyDown kann nur in AIR und nicht im Flash Player abgebrochen werden. Für welche entwickelst du? Ich konnte weder keyDown noch textinput in AIR abbrechen. Könnte ein Fehler sein. Warum protokollieren Sie keinen Fehler bei Adobe und sehen, was sie sagen?

Update: Ich habe bestätigt, dass dies in der Tat ein Fehler in spark.components.TextArea ist. Der Thread http://forums.adobe.com/thread/703195 spricht über ein ähnliches Problem. Ein Fehler wurde auch für Flex protokolliert - http://bugs.adobe.com/jira/browse/SDK-25542.

Workaround ist die Verwendung mx.controls.TextArea.

+0

Wie ich in der Post gesagt habe; Ich habe das schon mal ausprobiert. Das funktioniert nicht mit spark.components.TextArea. Wenn Sie die Eingabetaste drücken, zeichnet der Textinput nichts auf. Nur Spuren, wenn es sich um einen normalen Zeichenschlüssel wie a, b, c, usw. handelt. –

+0

Kann auch nicht. Was passiert, wenn der Text im Textfeld ausgewählt wird? Wenn Sie Enter drücken, wird alles gelöscht und nur das Entfernen des Zeilenumbruchs löst das Problem nicht. –

+0

Ich entwickle für AIR. Ja, scheint wie ein Fehler. –

0

Ich bin nicht gut Englisch. Bitte siehe Code.

<!--snip--> 
<fx:Script> 
    <![CDATA[ 

     protected function textArea_creationCompleteHandler(event:FlexEvent):void{ 
      textArea.addEventListener(TextOperationEvent.CHANGING,onChangingHandler); 
     } 

     //This event is faster than KEY_DOWN. 
     private function onChangingHandler(event:TextOperationEvent):void { 
      if(event.operation is SplitParagraphOperation){ 
       //SplitParagraphOperation only cancel. 
       event.preventDefault(); 
      } 
     } 

    ]]> 
</fx:Script> 
    <s:TextArea id="textArea" 
        width="100" 
        creationComplete="textArea_creationCompleteHandler(event)" 
        height="60" 
        /> 
    <!--snip-->