ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     [DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
mmx
投稿日時: 2007-6-15 17:44
お馴染みさん
登録日: 2006-11-17
居住地:
投稿: 15
Re: [DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
便乗で私の方の問題も解決しました。

Bindable属性が指定された型であればitemupdatedを使用しなくても自動的に通知されます。

とあるとおり基本的にはコレクションの要素のクラスに[Bindable]タグをつけることで変更の通知ができていたのですが、
一部の要素だけを別のカスタムコンポーネントに渡してその中で変更を行った場合に変更の通知がされていないことが有りました。

その場合に変更された要素が特定できる場合にitemUpdatedメソッドを行い、できない場合はexecuteBindingsを行うか全要素でitemUpdatedを行うか場合によって変えようと思います。
説明がわかりづらいですね^^;

ありがとうございました。
nobu
投稿日時: 2007-6-14 17:18
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
Re: [DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
皆さん、返信ありがとうございます。
enecoさんのやり方で実装したところ、無事に動作いたしました。

ArrayCollectionのメソッド(というかIListかな?)を使うとchange
イベントが発生ので反映されるということですね。
※だから、その中の一部だけ変えただけじゃ無理だったわけですか・・・。

それと、Cinbaさんの教えてくださったitemUpdatedメソッドです
が、これを使うともっと直接的に実装できるんですね。
若干、力技はいってますが以下のような実装でも動作いたしました。


e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk = !(e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk);
e.currentTarget.dataProvider.itemUpdated(e.currentTarget.dataProvider[e.currentTarget.selectedIndex]);


ようはitemUpdatedを追加したのみ。
・・・み、見づらいかも・・・^-^;;;;;

無事解決できて助かりました。みなさん、ありがとうございました。
Cinba
投稿日時: 2007-6-14 7:44
超常連さん
登録日: 2006-5-21
居住地:
投稿: 47
Re: [DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
おはようございます。
enecoさんが書かれて通りArrayCollectionを使います。
で、要素の変更通知は、ArrayCollectionのitemUpdatedでやってあげます。
http://livedocs.adobe.com/flex/201_jp/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=about_dataproviders_057_11.html
以下の例ではコレクションの要素はObject型なので上記のような通知をやらないけませんが、Bindable属性が指定された型であればitemupdatedを使用しなくても自動的に通知されます。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;

public function onKeydown(e:KeyboardEvent):void
{
	dgOnKeydown(e);
}


public function dgOnKeydown(e:KeyboardEvent):void
{
	switch (e.keyCode)
	{
		case 32:
			if (e.currentTarget.selectedIndex > -1)
			{
				var ar : ArrayCollection = e.currentTarget.dataProvider as ArrayCollection;
				var item : Object = ar[e.currentTarget.selectedIndex];
				item.chk = !(item.chk);
				ar.itemUpdated(item); // これがミソ。(^.^)
			}
			break;
	}
}
			]]>
	</mx:Script>
    <mx:Array id="array1">
            <mx:Object name="koyabu" chk="false" />
            <mx:Object name="tsujimoto" chk="false" />
            <mx:Object name="yasuo" chk="false" />
    </mx:Array>

	<mx:DataGrid  height="266" tabIndex="680" id="dg" keyDown="onKeydown(event);"
		 dataProvider="{new ArrayCollection(array1)}">
	<mx:columns>
		<mx:DataGridColumn headerText="名前" dataField="name" width="100"/>
		<mx:DataGridColumn headerText="チェック" dataField="chk" editorDataField="selected">
			<mx:itemRenderer>
				<mx:Component>
                    <mx:Box horizontalAlign="center" verticalAlign="middle">
                        <mx:CheckBox  id="checkBox" width="12"
                            selected="{data.chk}" change="data.chk=checkBox.selected"/>
                    </mx:Box>
				</mx:Component>
			</mx:itemRenderer>
		</mx:DataGridColumn>
	</mx:columns>
</mx:DataGrid>

</mx:Application>
eneco
投稿日時: 2007-6-13 19:59
ご主人様
登録日: 2006-2-16
居住地:
投稿: 135
Re: [DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
こんにちは。

配列の一部分を変更しても、その変更がDataGridに通知されない
ので自動的に変更を反映することはできません。
ArrayCollectionクラスのメソッドを使って変更するとうまくいくのではないかと思います。

getItemAt()でアイテムを取って編集し、setItemAt()で戻します。


if (e.currentTarget.selectedIndex > -1)
{
  //e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk = !(e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk);
  var item:Object = e.currentTarget.dataProvider.getItemAt(e.currentTarget.selectedIndex);
  item.chk = !item.chk;
  e.currentTarget.dataProvider.setItemAt( item, e.currentTarget.selectedIndex);
}


いかがですか?

では。
mmx
投稿日時: 2007-6-13 18:09
お馴染みさん
登録日: 2006-11-17
居住地:
投稿: 15
Re: [DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
>nobuさん

同様の現象は私も何度か確認しています。
私が確認してるのは、DataGridにバインドしているArrayに入れているオブジェクトの一部のプロパティのみ変更したときに、
DataGridに変更が反映されていない現象です。
私の対処としては、この現象を確認した場合プロパティの変更直後に対象のDataGridのexecuteBindingsメソッドを実行しています。
以下の記述を参考にしました。

http://www.adobe.com/livedocs/flex/201_jp/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=databinding_091_06.html


ただexecuteBindingsを実行した場合もDataGrid上のフォーカスが消失してしまうのでnobuさんの要求は満たせないかもしれません。
プロパティの変更が自動的に反映されればいいのですがその意味では問題は解決できていません。

見当違いな内容でしたら申し訳ありません。

nobu
投稿日時: 2007-6-13 16:41
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
[DataGrid]itemRendererで組み込まれたCheckBoxの値を変更させたい
DataGrid内にitemRendererで組み込んだCheckBoxの値(Selected)
を、CheckBoxをクリックするのではなく、DataGridのKeydownイベ
ントを使って設定(正確には反転)させようとしているのですが
うまくいきません。操作としては選択した行でSpaceキーを押下
したときに、その行のある列のCheckBoxのSelectedを反転させた
いというものです。
※DataGridは"1列選択"の状態です。

DataGridは、動的にdataProviderを使用しています。
(DB参照->ArrayをdataProviderに設定)

dataProviderを使用していますので、DataGridのdataProviderの
特定の行の値を設定し直してみたのですが、dataProvider内の
情報は変更されていますが、DataGridの表示上は何も変わらない
というものです。

以下、ソースです。(一部抜粋のみ)

<mx:DataGrid x="10" y="325" width="978" height="266" tabIndex="680" id="dg" keyDown="onKeydown(event);">
	<mx:columns>
		<mx:DataGridColumn headerText="名前" dataField="name" width="900"/>
		<mx:DataGridColumn headerText="チェック" dataField="chk" editorDataField="selected">
			<mx:itemRenderer>
				<mx:Component>
					<comp:CheckBoxRenderer width="14"/>
				</mx:Component>
			</mx:itemRenderer>

		</mx:DataGridColumn>
	</mx:columns>
</mx:DataGrid>


public function xxxfunc():void
{
	dg.dataProvider = <Array>;
}


public function onKeydown(e:KeyboardEvent):void
{
	dgOnKeydown(e);
}


public function dgOnKeydown(e:KeyboardEvent):void
{
	switch (e.keyCode)
	{
		case KeyboardUtil.KeyCode_Space:
			if (e.currentTarget.selectedIndex > -1)
			{
				e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk = !(e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk);
			}
			break;
	}
}


この他にdataProviderではな selectedItem.chk を直接変更して
みましたが、変化ありませんでした。唯一変化してくれたやり方



e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk = !(e.currentTarget.dataProvider[e.currentTarget.selectedIndex].chk);
e.currentTarget.dataProvider = e.currentTarget.dataProvider;


上記のように一度dataProviderを入れなおすという方法でうまくは
いったのですが、このやり方だとDataGrid上のフォーカスが消失
するという問題が発生する為、断念しました。
※再描画の再にフォーカスが離れるのだと思います。

過去ログも探してみたのですが、"値の取得"はあるのですが"値の
設定"というのは見つけられませんでした。

このような対応をされた事のある方がいらっしゃいましたら、
アドバイスをお願いします。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を