Excel как поведение с SlickGrid - PullRequest
1 голос
/ 19 ноября 2010

Я хотел бы имитировать определенное поведение электронных таблиц с помощью SlickGrid.Пользователь:

  1. нажимает на ячейку, чтобы активировать ее
  2. вводит =sum( или по любой другой формуле,
  3. сохраняется исходный адрес ячейки
  4. пользователь выбирает диапазон ячеек (я предполагаю, что исходная ячейка закрывает редактор)
  5. фокус возвращается к исходной ячейке с добавленным новым диапазоном ячеек.т.е. = сумма (r1c1, r2c2).

Меня отталкивает необходимость сменить фокус.

var cell_with_formula = null;
grid = new Grid($("#myGrid"), data, columns, options);

// save original cell address, but there is no onBlur event
grid.onBlur = function(args){
  cell_with_formula = args; // save address
}; 

grid.onCellRangeSelected = function(){
  if(cell_with_formula){
    // check if cell_with_formula has `=` at begining
    // if so, append selected range    
    cell_with_formula = null;
  }
}; 

Заранее спасибо!

1 Ответ

6 голосов
/ 27 ноября 2010

Это невозможно в SlickGrid 1.4.x, но будет поддерживаться в версии 2.0, которая в настоящее время все еще находится в активной разработке.Альфа находится в отдельной ветке на GitHub - https://github.com/mleibman/SlickGrid/tree/v2.0a,, и я только что проверил предварительный код, который поддерживает это на примере.Пожалуйста, смотрите https://github.com/mleibman/SlickGrid/commit/17b1bb8f3c43022ee6aec89dcab185cd368b8785.

Вот базовая реализация редактора формул:

function FormulaEditor(args) {
    var _self = this;
    var _editor = new TextCellEditor(args);
    var _selector;

    $.extend(this, _editor);

    function init() {
        // register a plugin to select a range and append it to the textbox
        // since events are fired in reverse order (most recently added are executed first),
        // this will override other plugins like moverows or selection model and will
        // not require the grid to not be in the edit mode
        _selector = new Slick.CellRangeSelector();
        _selector.onCellRangeSelected.subscribe(_self.handleCellRangeSelected);
        args.grid.registerPlugin(_selector);
    }

    this.destroy = function() {
        _selector.onCellRangeSelected.unsubscribe(_self.handleCellRangeSelected);
        grid.unregisterPlugin(_selector);
        _editor.destroy();
    };

    this.handleCellRangeSelected = function(e, args) {
        _editor.setValue(_editor.getValue() + args.range);
    };


    init();
}
...