Добавьте функцию itemEditorValidator с подтверждением всплывающего окна к Flexicious Grid

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

    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, но я не смог решить, какой метод переопределить. Я хотел переопределить метод и вызывать super только в том случае, если Alert нажал OK, но я не мог понять, какой метод мне следует переопределить. Я попытался переопределить защищенную функцию onTextInput(textEvent:TextEvent):void, но это ничего не сделало.

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

2 ответа

Решение

Вот что работает:

    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;
    }

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

Другие вопросы по тегам