ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     dataProviderの更新について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
hys73
投稿日時: 2015-12-12 19:50
ご主人様
登録日: 2011-10-24
居住地: 大阪
投稿: 54
dataProviderの更新について
下記のコードで一括ボタンを押したときに、ボタンのラベルを『表示』としたいのですが、
うまく更新ができません。
また、コレクションを追加してそれぞれ実施するとへんな動きをします
わけがわからず途方に暮れております。
確実に更新するにはどのようにすればよいでしょうか?

テスト1
dt.addItem({ dataField1: "1", dataField2:"非表示"});
の場合でテスト
dt.getItemAt(0)["dataField2"] = "表示"
ボタンラベルは『表示』のまま変化なし。


テスト2
dt.addItem({ dataField1: "1", dataField2:"非表示"});
dt.addItem({ dataField1: "2", dataField2:"非表示"});
の2行の場合でテスト
dt.getItemAt(0)["dataField2"] = "表示"
dt.getItemAt(1)["dataField2"] = "表示"
2行とも、ボタンは『表示』となり正常に動作する


テスト3
dt.addItem({ dataField1: "1", dataField2:"非表示"});
dt.addItem({ dataField1: "2", dataField2:"非表示"});
dt.addItem({ dataField1: "3", dataField2:"非表示"});
の3行の場合でテスト
dt.getItemAt(0)["dataField2"] = "表示"
dt.getItemAt(1)["dataField2"] = "表示"
dt.getItemAt(2)["dataField2"] = "表示"
1行目と3行目は『表示』となるが、2行目は『非表示』のまま変わらず。



テストコード


<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" initialize="init(event)" width="400" height="500">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.ICollectionView;
import mx.events.FlexEvent;


[Bindable]
public var dt:ArrayCollection;
protected function init(event:FlexEvent):void
{
dt = new ArrayCollection();
dt.addItem({ dataField1: "1", dataField2:"非表示"});
}

protected function btn_allvisible_clickHandler(event:MouseEvent):void
{
dt.getItemAt(0)["dataField2"] = "表示"
ICollectionView(dg.dataProvider).refresh();
}

]]>
</fx:Script>

<s:Button id="btn_allvisible" x="10" y="10" width="200" height="40" label="一括" color="#FFFFFF" fontFamily="メイリオ" fontSize="18" click="btn_allvisible_clickHandler(event)" />
<s:DataGrid id="dg" dataProvider="{dt}" editable="true" x="10" y="100" width="300" height="300" fontFamily="メイリオ" fontSize="18" >
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="dataField1" headerText="No" width="100" editable="false"></s:GridColumn>
<s:GridColumn headerText="表示" dataField="dataField2" editable="false" >
<s:itemRenderer>
<fx:Component>
<s:GridItemRenderer clipAndEnableScrolling="true">
<fx:Script><![CDATA[

public function visibleon(e:MouseEvent):void {

if (e.target.label == "非表示"){
e.target.label="表示";
}else{
e.target.label="非表示";
}
}

]]>
</fx:Script>
<s:Button id="deskButton" top="10" left="20" label="{data.dataField2}" click="visibleon(event)"/>
</s:GridItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>

</s:WindowedApplication>


shimitei
投稿日時: 2015-12-14 18:01
やや お馴染みさん
登録日: 2012-4-27
居住地:
投稿: 10
Re: dataProviderの更新について
動的プロパティはバインディングが働かないため、データ用のクラスを作ると良いです。

引用:
dt.addItem({ dataField1: "1", dataField2:"非表示"});

このようなObjectではなく、次のようなクラスを作り
dt.addItem(new DataClass("1", "非表示"));
のようにします。

package
{
public class DataClass
{
[Bindable]
public var dataField1:String;
[Bindable]
public var dataField2:String;

public function DataClass(d1:String="", d2:String="")
{
this.dataField1 = d1;
this.dataField2 = d2;
}
}
}
hys73
投稿日時: 2015-12-16 10:20
ご主人様
登録日: 2011-10-24
居住地: 大阪
投稿: 54
Re: dataProviderの更新について

回答ありがとうございます。

私の知識が浅学な為、きちんと理解できていないのですが、
結局のところ、ArrayCollectionに格納してしまうと同じではないのでしょうか?

記載頂いた通りに、
DataClassを作って、
dt(ArrayCollection)にaddItemした後、
dt.getItemAt(0)["dataField2"] = "表示"と配列の中を変更しても
状況は変わりませんでした。
(dtに格納するデータが1行の時は問題ないが、複数データのときに変更できないレコードがあります)

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を