Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Datagrid сумма ячеек (http://www.flasher.ru/forum/showthread.php?t=197397)

arahmanov 06.04.2013 20:00

Datagrid сумма ячеек
 
Задача считать значения из одной ячейки.... Норма.... пока реализовано со всех, не могу понять как обратиться к определенной ячейке

Код AS3:

raboti.columns = ["id","Работы","Цена","Норма","Сумма","Исполнитель" ,"удалить" ]
 
btnadd.addEventListener(MouseEvent.CLICK, addstroka);
 
function addstroka(event:Event):void
{
 
raboti.editable = true;
var i = raboti.length;
var kkk =st.text;
i++;
 
var nor = null;
import fl.events.DataGridEvent;
import fl.data.DataProvider;
import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridCellEditor;
import fl.controls.listClasses.ListData;
import fl.events.DataGridEvent;
var drabotig = null;
 
 
    raboti.addItem({id:i, Работы:"", Цена:st.text, Норма:nor, Сумма:drabotig, Исполнитель:""});
 
raboti.addEventListener(DataGridEvent.ITEM_EDIT_END,onItemEditEnd);
function onItemEditEnd(e:DataGridEvent):void {
    var cellEditor:DataGridCellEditor = raboti.itemEditorInstance as DataGridCellEditor;
    var listData:ListData = cellEditor.listData;
    trace("After Edit: " + cellEditor.text);
}
}


Александр Мостовой 07.04.2013 00:01

В обрабочике вы получаете анонимный объект который сами задавали в addItem. В вашем случае имена свойств этого объекта имеют киррилические названия. Вы можете обращаться к ним через квадратные скобки.
Код AS3:

raboti.addItem({id:i, Работы:"", Цена:st.text, Норма:nor, Сумма:drabotig, Исполнитель:""});

Хотя AS3 допускает кирилические символы в переменных. И эта запись идентична
Код AS3:

var myObject:Object = new Object();
myObject.id = i;
myObject.Цена = st.text;
myObject.Норма = nor;
...
 
raboti.addItem(myObject);

Соответстенно обратиться к полученному объекту вы можете как при обычной работе с объектом-ассоциативным массивом:
Код AS3:

function onItemEditEnd(e:DataGridEvent):void
{
        var cellEditor:DataGridCellEditor = raboti.itemEditorInstance as DataGridCellEditor;
        var data:Object = cellEditor.data; // или через listData таким же оразом для колонки
        data["Сумма"] = data["Работы"] + data["Цена"] + data["Норма"] + data["Исполнитель"]; //или data.Cумма = data.Работы ...
 
 
}

Цитата:

пока реализовано со всех, не могу понять как обратиться к определенной ячейке
Логика работы с DataGrid не совсем такая как могли привыкнуть при работе с таблицами в Exel, например.
Подсчет значений необходимо производить в модели данных, а не по индексу ячеек, которые в нем не задуманы для использования как порядковый номер.

Для повышения производительности DataGrid (точнее его составные элементы List) построен так, что ячейки в нем не пересоздаются при изменении данных, а постоянно отрисованы на экране в и CellRendrer ( класс отрисовки ячеек) приходят ссылки на текущую модель данных.

Лучше всего отнаследоваться от CellRendrer и в сеттере data вставить свой обработчик на поступление данных

Код AS3:

                override public function set data(value:Object):void 
                {                       
                        if (value != _data) //Ячейка получила ссылку на новый объект модели данных, напрмер при пересортировке.
                        {
              var dataRow:ModelRow = value as ModelRow ; //ModelRow - это тот же объект item в вашем примере, но типихированный
                                //Отписываемся / подписываемся на событие обновления данных. Пишем прочую логику.
 
                        }                       
                }

Такая логика позволяет DataGrid отображать огромное количество зписий в компоненте, т.к. фактически визуально представлены лишь те ячейки которые отображены сейчас на экране, те что за прокрутками не отрисовываются.


Объект модели данных приходящий в поле data представляет из себя всю строрку. Узнать какая ячейка сечас текущая для этого элемента (то есть имя текущей колонки) можно из сеттера CellRendrer ListData
Код AS3:

override public function set listData(value:ListData):void

Так сделано потому что у DataGrid могут быть горизонтальные прокрутки, поэтому ячейка не знает какакая колонка к ней поподет после прокрутки. Т.е. прокрутив скрол вправо в эту же ячейку вместо поля "id" придет поле "Сумма"

Добавлено через 46 минут
В общем я немного запутанно объяснил, если кратко то:
Вместо анонимного объекта,
Код AS3:

{id:i, Работы:"", Цена:st.text, Норма:nor, Сумма:drabotig, Исполнитель:""}

созадете экземпляр совего класса и внем высчитываете все значения
Код AS3:

raboti.addItem(new ModelRow(id, "", sr.text, nor, Сумма:drabotig, "");

В свойство колонки передаете конструктор наследник CellRenderer отрисовывающий ячейку
Код AS3:

var dataGridColumn:DataGridColumn = new DataGridColumn("id");
 dataGridColumn.cellRenderer = MyClassCellRenderer


arahmanov 07.04.2013 21:00

Спасибо за такое подробное описание ....решил проблему на половину а именно , все вродебы нормально но при редактирование ячеек выдает вот такую вот ошибку


Код AS3:

ReferenceError: Error #1069: Property selectedItem not found on fl.controls.dataGridClasses.DataGridCellEditor and there is no default value.
        at baza_fla::MainTimeline/gridItemClick()[baza_fla.MainTimeline::frame4:85]
        at flash.events::EventDispatcher/dispatchEventFunction()
        at flash.events::EventDispatcher/dispatchEvent()
        at fl.controls::TextInput/handleChange()


Код AS3:

raboti.columns = ["id","Работы","Цена","Норма","Сумма","Исполнитель" ,"удалить" ]
 
btnadd.addEventListener(MouseEvent.CLICK, addstroka);
 
function addstroka(event:Event):void
{
 
 
 
 
raboti.editable = true;
var i = raboti.length;
var kkk =st.text;
i++;
var myObject:Object = new Object();
myObject.id = i;
myObject.Цена = st.text;
myObject.Норма = "";
myObject.Сумма = "";
myObject.Исполнитель = "";
 
raboti.addItem(myObject);
 
}
 
 
 
 
 
raboti.addEventListener(Event.CHANGE, gridItemClick);
 
function gridItemClick (event:Event):void {
        var cena =event.target.selectedItem.Цена;
        var norma =event.target.selectedItem.Норма;
        var summ = cena * norma;
        trace (cena);
        trace (norma);
        trace (summ);
        //var rur = event.target.selectedItem.Сумма = summ;
 
}

Добавлено через 21 час 9 минут
сделал :
Код AS3:

function gridItemClick (event:Event):void {
var rur = event.target.selectedItem.сумма =event.target.selectedItem.цена * event.target.selectedItem.норма;
}



Часовой пояс GMT +4, время: 19:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.