2014-09-04 1 views
1

Я пытаюсь, чтобы мой Flexical DataGrid попросил подтверждения изменения, когда я нажимаю на ячейку, чтобы изменить значение и ввести новое значение, которое отличается от оригинала определенным процент. Я не вижу простого способа сделать это. Первоначально я попытался написать itemEditorValidatorFunction, который возвращает логическое значение. Это отлично работает для жесткого кодированного возвращаемого значения, но если я пытаюсь взять значение, возвращаемое из CloseEvent предупредительного, что значение игнорируется:Добавить itemEditorValidatorFunction с подтверждением окна всплывающего окна для Flexicious Grid

protected function validateGcCap(editor:UIComponent):Boolean{ 
     var warningBPDiffVal:Number = Number(5); 
     var warningPerCentDiffVal:Number = Number(warningBPDiffVal/1000); 
     var allowChange:Boolean = true; 
     var origGcCapVal:Number = Number(managerGrid.getCurrentEditingCell().text); 
     var newGcCapVal:Number = Number((editor as TextInput).text); 
     var diffVal:Number = Number(newGcCapVal - origGcCapVal); 

     if (origGcCapVal > newGcCapVal) { 
      diffVal = origGcCapVal - newGcCapVal; 
     } 

     if (diffVal > warningPerCentDiffVal) { 
      //Alert.show("you changed the gccap from " + origGcCapVal + " to " + newGcCapVal + " by " + diffVal); 

      function alertCloseHandler(event:CloseEvent):void{ 
       if (event.detail == Alert.CANCEL) { 
        allowChange = false; 
       } 
      }; 

      var alert:Alert = Alert.show("Are you sure that you want to update gcCap% by more than " + warningBPDiffVal + "bps?", 
        "Please Confirm", (Alert.OK | Alert.CANCEL), 
        this, alertCloseHandler); 
     } 

     return allowChange; 
    } 

Я также попытался написать itemEditor для сеток: FlexDataGridColumn , где я расширил com.flexicious.controls.TextInput, но я не мог решить, какой метод переопределить. Я хотел переопределить метод и только сделать вызов супер, если Alert был нажат OK, но я не мог видеть, какой метод я должен переопределить. Я попытался переопределить защищенную функцию onTextInput (textEvent: TextEvent): void, но ничего не сделал.

Буду благодарен за понимание этой проблемы.

ответ

0

Это то, что работает:

private function validateGcCap(editor:UIComponent):Boolean{ 
     var warningBPDiffVal:Number = Number(5); 
     var cell:IFlexDataGridCell = managerGrid.getCurrentEditingCell(); 
     var warningPerCentDiffVal:Number = Number(warningBPDiffVal/1000); 
     var origGcCapVal:Number = Number(cell.text); 
     var newGcCapVal:Number = Number((editor as TextInput).text); 
     var diffVal:Number = Number(newGcCapVal - origGcCapVal); 

     if (origGcCapVal > newGcCapVal){ 
      diffVal = origGcCapVal - newGcCapVal; 
     } 

     if (diffVal > warningPerCentDiffVal){ 

      function alertCloseHandler(event:CloseEvent):void{ 
       if (event.detail == Alert.CANCEL) { 
        IAParamsVO(cell.rowInfo.data).gcCapWrapper = origGcCapVal; 
        managerGrid.refreshCells(); 
       } 
      } 

      Alert.show("Are you sure that you want to update gcCap% by more than " 
           + warningBPDiffVal + "bps?", "Please Confirm", (Alert.OK | Alert.CANCEL), 
        this, alertCloseHandler); 
     } 

     return true; 
    } 
+0

Вы должны получить ссылку на ячейку перед внесением изменения, а затем в метод alertCloseHandler, ударяющий CANCEL, возвращает значение обратно в исходное. –

0

Не знаете, почему кто-то решил сфокусировать ваш вопрос, кажется вполне действительным. Исходя из этого, лучшим способом для вас было бы «отменить» редактирование, когда пользователь не будет выбирать его. Если у вас включен enableTrackChanges, все, что вам нужно сделать, это удалить это изменение из коллекции dgGrid.changes и вызвать dgGrid.refreshCells(). Если у вас нет enableTrackChanges, все, что вам нужно сделать, это обновить строку dataProvider со старым значением, вызовите dgGrid.refreshCells(), и вы должны быть установлены.

+0

Спасибо. Так что должен ли я иметь тот же код, что и выше, который вызывается itemEditorValidatorFunction = "validateGcCap", если метод возвращает true независимо от выбора пользователя Alert и имеет функцию alertCloseHandler, установите строку dataProvider обратно в то, что она была готова, а затем Вызовите dgGrid.refreshCells()? Спасибо за помощь. –

+0

Следующие работали. Вы должны получить ссылку на ячейку, прежде чем нажать «Оповещение», а затем отбросить файл cell.rowInfo.data в VO и вернуть значение обратно к исходному значению: function alertCloseHandler (event: CloseEvent): void { if (event.detail == Alert.CANCEL) { IAParamsVO (cell.rowInfo.data) .gcCapWrapper = origGcCapVal; managerGrid.refreshCells(); } } –

+0

Замечательно, пожалуйста, примите ответ, если он решит ваш вопрос. –