PDA

Просмотр полной версии : Datagrid сумма ячеек


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

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. В вашем случае имена свойств этого объекта имеют киррилические названия. Вы можете обращаться к ним через квадратные скобки.
raboti.addItem({id:i, Работы:"", Цена:st.text, Норма:nor, Сумма:drabotig, Исполнитель:""});
Хотя AS3 допускает кирилические символы в переменных. И эта запись идентична
var myObject:Object = new Object();
myObject.id = i;
myObject.Цена = st.text;
myObject.Норма = nor;
...

raboti.addItem(myObject);

Соответстенно обратиться к полученному объекту вы можете как при обычной работе с объектом-ассоциативным массивом:
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 вставить свой обработчик на поступление данных

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

}
}

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


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

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

Добавлено через 46 минут
В общем я немного запутанно объяснил, если кратко то:
Вместо анонимного объекта,
{id:i, Работы:"", Цена:st.text, Норма:nor, Сумма:drabotig, Исполнитель:""}
созадете экземпляр совего класса и внем высчитываете все значения
raboti.addItem(new ModelRow(id, "", sr.text, nor, Сумма:drabotig, "");

В свойство колонки передаете конструктор наследник CellRenderer отрисовывающий ячейку
var dataGridColumn:DataGridColumn = new DataGridColumn("id");
dataGridColumn.cellRenderer = MyClassCellRenderer

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


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()


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 минут
сделал :
function gridItemClick (event:Event):void {
var rur = event.target.selectedItem.сумма =event.target.selectedItem.цена * event.target.selectedItem.норма;
}