新しく質問する

DataGrid コンポーネントのChangeハンドラーについて

役に立った:0件
  • 質問者:sato777
  • 投稿日時:2006/09/13 14:44
  • 困り度:すぐに回答が欲しいです

WinXP、Flash8Proにてオーサリングしております。

質問です。
DataGridコンポーネントにおいて、
エクセルの様に表を作り、そこに商品や金額、数量の
3つのColumnを作り、
合計金額と合計個数は
別途、ダイナミックTEXTフィールドに
自動計算後表示させるといった内容を構築しております。

それでですが、
Flash再生時に、
DataGridコンポーネントに一度読み込まれたDataにおいて、
数量のcolumnの値が手動で変更された時に
Changeハンドラーがトリガーし、
合計金額と数量合計を再計算後、
ダイナミックテキストフィールドに
再表示させたいのですが、
設定としては、DataGridの数量のColumnだけが編集可能としているのですが、
Flash再生時に
この部分の数値を手動で変更すると
変更前の値と変更した値を
返り値として取得するにはどうしたら良いのでしょうか?

また、その際に、価格*変更された数量=
といった再計算も必要となるのですが
動的に変更された数量から、その列の"価格"のIndexを
取得し、再計算させる方法もわかりません。

何か方法などありましたら、教えて頂きたいです。
どうぞ宜しくお願い致します。



FlashヘルプのDataGridコンポーネントを見ても、
解決できませんでした。

どうぞ宜しくお願い致します。

*DataSetを使わないのは、Flash6から対応にしたいためです。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:0件)
  • 参考になった:0件

No.1ベストアンサー20pt

  • 回答者:perse
  • 回答日時:2006/09/14 02:46

コンナ感じでしょうか?
グリッドのインスタンス名はmyGridです。

//-----------------------------------------------------------------
var data_array = new Array();
data_array[0] = {商品:"なし", 金額:120, 個数:7};
data_array[1] = {商品:"りんご", 金額:100, 個数:4};
data_array[2] = {商品:"メロン", 金額:1200, 個数:4};
data_array[3] = {商品:"さくらんぼ", 金額:20, 個数:20};
data_array[4] = {商品:"バナナ", 金額:30, 個数:10};

myListener = new Object();
var oldval = "";
var newval = "";

myGrid.dataProvider = data_array;
myGrid.editable = true;

//フォーカスインのとき編集前値取得
myListener.cellFocusIn = function(event) {
oldval = myGrid.getItemAt(event.itemIndex)[myGrid.columnNames[event.columnIndex]];
trace(oldval);
};
//フォーカスアウトのとき編集前後の値を比較
myListener.cellFocusOut = function(event) {
newval = myGrid.getItemAt(event.itemIndex)[myGrid.columnNames[event.columnIndex]];
//値が変わってるとき合計を再計算
if (newval != oldval) {
sum_txt.text = CalcSum();
}
};

//リスナー追加
myGrid.addEventListener("cellFocusIn", myListener);
myGrid.addEventListener("cellFocusOut", myListener);

//値計算関数
function CalcSum():Number {
var sum = 0;
for (var i = 0; i<myGrid.length; i++) {
sum += myGrid.getItemAt(i).金額*myGrid.getItemAt(i).個数;
}
return sum;
}

//初期表示時の合計表示
sum_txt.text = CalcSum();

通報する

この回答への補足

import mx.controls.gridclasses.DataGridColumn;
var my_dg:mx.controls.DataGrid;
//my_dg.setSize(262, 200);

// 列をグリッドに追加する。
var itemname:DataGridColumn = new DataGridColumn("商品");
//var itemname:DataGridColumn = new DataGridColumn("article");
itemname.width = 130;
itemname.headerText = "商品名";
my_dg.addColumn(itemname);

// 2 番目の列をグリッドに追加する。
//var itemprice:DataGridColumn = new DataGridColumn("price");
var itemprice:DataGridColumn = new DataGridColumn("金額");
itemprice.width = 50;
itemprice.headerText = "価格";
my_dg.addColumn(itemprice);

// 3 番目の列をグリッドに追加する。
//var itemamount:DataGridColumn = new DataGridColumn("amount");
var itemamount:DataGridColumn = new DataGridColumn("個数");
itemamount.width = 36;
itemamount.headerText = "数量";
my_dg.addColumn(itemamount);

my_dg.getColumnAt(0).editable=false;
my_dg.getColumnAt(1).editable=false;
my_dg.getColumnAt(2).editable=true;

いつも有難う御座います。
私のスクリプトに教えて頂いたスクリプトを追加してみましたが
Dataが読み込まれません。
私が
myGrid.dataProvider = data_array;
の仕組みが理解できていないためだと思いますが
どのように変更すれば良いのでしょうか?

どうぞ宜しくお願い致しますm(_ _)m

この回答へのお礼

いつも有難う御座います!
DataGridは、getItemAtが使えないので
以下のように変更すると動きました。

sum += myGrid.DataProvider.getItemAt(i).金額*myGrid.DataProvider.getItemAt(i).個数;

感無量です。
調べつくしていたので、今回は無理だろうと
諦めていました。
本当に感謝しています。
有り難う御座いました!

  
このQ&Aは役に立ちましたか?(役に立った:0件)

このページのトップへ