ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
sai_vowm
投稿日時: 2012-9-5 17:29
やや お馴染みさん
登録日: 2012-9-5
居住地:
投稿: 8
DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
いつもお世話になっております。
Flex builder 3.0で開発しております。
提題についてフォーラム内やサーチを色々と検索したのですが、
解決策を見つけることができませんでしたので、お知恵をお貸しください。

下記のようなDataGridの中にあるitemRenderer、Componentの内部の
Buttonのlabelを動的に変更したいと考えています。

<mx:DataGrid id="sample_DataGrid" dataProvider="{sampleList}" editable="true">
  <mx:columns>
    <mx:DataGridColumn id="aaa" headerText="aaa" dataField="aaa_filed" labelFunction="{aaa_labelFunction}" editable="true" />
    <mx:DataGridColumn id="bbb" headerText="bbb" editable="false">
      <mx:itemRenderer>
        <mx:Component>
          <mx:VBox height="100%" width="100%"">
            <mx:Button id="clear_btn" label="ボタン名" click="outerDocument.func(data);" />
          </mx:VBox>
        </mx:Component>
      </mx:itemRenderer>
    </mx:DataGridColumn>
  </mx:columns>
</mx:DataGrid>

しかしプログラムに clear_btn.label = "ボタン名を変更" と記述すると、
「未定義のプロパティclear_btnへのアクセスです」と
ビルド前にエラーになってしまいます。

変更するタイミングは画面の初期化時や、画面の更新がかかるタイミングで、
このボタンのクリックイベント等ではありません。
DataGrid内ではないボタンのラベルは同じ記述で変更できますが、
やはりitemRendere内は参照の書き方が違うのでしょうか。

恐れ入りますがご存知の方、ご教授頂けると幸いです。
Deyan
投稿日時: 2012-9-5 19:09
常連さん
登録日: 2006-7-10
居住地: 板橋区
投稿: 34
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
直接書くなら

<mx:DataGrid id="sample_DataGrid" dataProvider="{sampleList}" editable="true">
  <mx:columns>
    <mx:DataGridColumn id="aaa" headerText="aaa" dataField="aaa_filed" labelFunction="{aaa_labelFunction}" editable="true" />
    <mx:DataGridColumn id="bbb" headerText="bbb" editable="false">
      <mx:itemRenderer>
        <mx:Component>
          <mx:VBox height="100%" width="100%"">
            <mx:Script>
                <![CDATA[
                     "ここにコードを書く"
                ]]>
            </mx:Script>
            <mx:Button id="clear_btn" label="ボタン名" click="outerDocument.func(data);" />
          </mx:VBox>
        </mx:Component>
      </mx:itemRenderer>
    </mx:DataGridColumn>
  </mx:columns>
</mx:DataGrid>

ですね。ただ、itemRendererを使う場合は
<mx:Component>の中の

 <mx:VBox height="100%" width="100%"">
     <mx:Button id="clear_btn" label="ボタン名" click="outerDocument.func(data);" />
 </mx:VBox>

の部分を別クラスにして、

<mx:DataGrid id="sample_DataGrid" dataProvider="{sampleList}" editable="true">
  <mx:columns>
    <mx:DataGridColumn id="aaa" headerText="aaa" dataField="aaa_filed" labelFunction="{aaa_labelFunction}" editable="true" />
    <mx:DataGridColumn id="bbb" headerText="bbb" editable="false" itemRenderer="net.fxug.sample.sampleRenderer"/>
  </mx:columns>
</mx:DataGrid>

ってな感じにしたほうがクラス分けとしてはよりスマートでしょう。
sai_vowm
投稿日時: 2012-9-6 10:25
やや お馴染みさん
登録日: 2012-9-5
居住地:
投稿: 8
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
Deyanさま

ご返信、大変ありがとうございます。
取り急ぎ、教えていただいた前者の方法で、ボタンのラベルをプログラムから変更することが出来ました。

<mx:VBox height="100%" width="100%" >
  <mx:Script>
    <![CDATA[
       var button_name:String = "ボタン名";
    ]]>
  </mx:Script>
  <mx:Button id="clear_btn" label="{button_name}" click="outerDocument.func(data);" />
</mx:VBox>

別クラスにする方も出来たら実装してみたいと思います。ありがとうございました。

度々すみません、もう一点、このScript内のbutton_nameを
親アプリケーションや同じ画面の変数・関数から取得したいと思っていました。
var button_name:String = parrentApplication.button_name (button_nameはparentApplicationに設定済) や
parentDocument.getButtonName (同じ画面内のこことは別のScript内) などを作って
参照してみたのですが、「null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」とエラーになってしまいます。
この中から外部の変数にアクセスするにはどう記述したらよいのでしょうか?
変数のスコープなどについて見てみたのですが、ここからのアクセスはよく理解することが出来ませんでした・・・。
何度も申し訳ありません、ご教示頂けると大変幸いに思います。
Deyan
投稿日時: 2012-9-6 12:08
常連さん
登録日: 2006-7-10
居住地: 板橋区
投稿: 34
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
var button_name:String = outerDocument.button_name
で取れませんか?
sai_vowm
投稿日時: 2012-9-6 14:08
やや お馴染みさん
登録日: 2012-9-5
居住地:
投稿: 8
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
Deyanさま

ご返信たいへんありがとうございます。
お教えいただいたこれらも含め、色々試させて頂いたのですが、
実行時にouterDocumentがnullになってしまいます。
ボタンクリック時に指定してあるouterDocumentはきちんと実行出来ているのですが。

色々試行錯誤していたところ、ウィンドウを明示的にインスタンス化することで
outerDocumentのpublic変数にはアクセスすることが出来ました。

SampleWindow.mxml
public var button_name:String = "ボタン名";
(省略)
<mx:Script>
  <![CDATA[
    // var button_name:String = outerDocument.button_name; // これはouterDocumentがnullになりました

    private var sampleWin:SampleWindow = new SampleWindow();
    private var button_name:String = sampleWin.button_name; // これで取得できました
  ]]>
</mx:Script>

ただ、本当はSampleWindowのcreationComplete時に、
button_name = parentApplication.button_nameというふうに
Main.mxmlで設定しているbutton_nameを代入していて、
それをそのまま使おうとすると実行時にparrentApplicationのnull 参照エラーが出てしまいます。

ここからparentApplicationのpublic変数にアクセスするのは問題があって無理なのでしょうか。
何度もお手数おかけいたしますが、もしもご存知でしたら、お教え頂けるとたいへん助かります。
Deyan
投稿日時: 2012-9-6 14:38
常連さん
登録日: 2006-7-10
居住地: 板橋区
投稿: 34
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
急にSampleWindowなるクラスが出てきましたが、そうするとMainとの関係がありますので、コードの断片だけですと状況がよくわからないです。
もしかしてSampleWindowはMainからポップアップされますか?あと、最初の質問のDatagridの話とこれは同じSampleWindowの話でしょうか?
もしよろしければご自分の判断でソースコードを省略せず、できる限りのものを載せていただきたいです。
sai_vowm
投稿日時: 2012-9-6 15:56
やや お馴染みさん
登録日: 2012-9-5
居住地:
投稿: 8
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
Deyanさま

ご返信ありがとうございます。
わたしの勝手な判断でコードを省略してしまい、大変失礼いたしました。
はい、DataGridはSampleWindow内のものです。
SampleWindowは、Mainからではなく、TestWindowのメニューからポップされ、
そのTestWindowが、Main.mxmlからポップされます。
またMain.mxmlはbutton_nameのパラメータと一緒にIndex.phpから呼ばれます。

Index.php
→Main.mxml (publicのbutton_nameをパラメータから持つ)
→Test.mxml
→Sample.mxml (dataGrid含む)
という画面遷移です。

以下、関連のある部分を記載させていただきます。
少し長くなりますが、どうかご容赦下さい。

Main.mxml

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:ns1="*" creationComplete="init();">
  <mx:Script>
    <![CDATA[

      //ボタン名
      public var button_name:String = "";
      
      /**
       * 初期化
       *
       */
      private function init():void
      {
        button_name = parameters.button_name; // Mainを起動する際、ユーザが選択したボタン名が代入されます。
      }
      
      /**
       * テストウィンドウをオープンする関数(Main.mxmlに生成したメニューバーから実行されます)
       *
       */
      public function openTestWindow(windowID:String, windowTitle:String):void
      {
        var win:TestWindow = new TestWindow();
        win.windowID = "TestWindow"
        openWindow(win);
      }

    ]]>
  </mx:Script>
</mx:Application>


TestWindow.mxml

<ResizableTitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();">
  <mx:Script>
    <![CDATA[

      /**
       * サンプルウィンドウをオープンする関数(TestWindow.mxmlに生成したメニューバーから実行されます)
       * 
       */
      private function openSampleWindow():void
      {
        var win:SampleWindow = new SampleWindow();
        win.windowID = "SampleWindow";
        Application.application.openWindow(win);
      }

    ]]>
  </mx:Script>
</ResizableTitleWindow>

SampleWindow.mxml

<ResizableTitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();">
  <mx:Script>
    <![CDATA[

      //ボタン名
      public var button_name:String;
      /**
       * 初期化
       *
       */
      private function init():void
      {
        button_name = parentApplication.button_name;
      }
    ]]>
  </mx:Script>

  <mx:VBox>
    <mx:DataGrid dataProvider="{dataList}" editable="true" sortableColumns="false">
      <mx:columns>
        <mx:DataGridColumn id="key1" />
        <mx:DataGridColumn id="key2">
          <mx:itemRenderer>
            <mx:Component>
            <mx:VBox>
              <mx:Script>
                <![CDATA[
                  [Bindable]
                  private var button_name:String = outerDocument.button_name; // ここでSampleWindowかMainのpublic変数「button_name」を取得したいです
                ]]>
                </mx:Script>
              <mx:Button id="clear_btn" label="{button_name}" click="outerDocument.clear(data);" />
            </mx:VBox>
            </mx:Component>
          </mx:itemRenderer>
        </mx:DataGridColumn>
      </mx:columns>
    </mx:DataGrid>
  </mx:VBox>
</ResizableTitleWindow>

これを実行し、TestWindowからSampleWindowを呼び出すと、
null参照のエラーとなります。
parentApplication.button_nameへのアクセスがうまくいっていないような気がします。

ほかは関連する部分はないと思うのですが、
情報に不足などありましたらお知らせ下さい。
よろしくお願いいたします。
Deyan
投稿日時: 2012-9-6 18:55
常連さん
登録日: 2006-7-10
居住地: 板橋区
投稿: 34
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
ソースをたくさん書いていただきありがとうございます。
ひとつ伺っておきたいのですが、 SDK4系ならFlexGlobals.topLevelApplication、3系ならApplication.applicationって試されました?
sai_vowm
投稿日時: 2012-9-6 19:54
やや お馴染みさん
登録日: 2012-9-5
居住地:
投稿: 8
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
Deyanさま

ご返信ありがとうございます。
Application.applicationを試してみましたが、「未定義のプロパティ Application へのアクセスです」とエラーになってしまいました。

結論から言うと、ボタンのlabelに下記のように直接outerDocumentを指定することで、
Sample.mxmlに設定したpublic変数にアクセスすることが出来ました。


<mx:Button id="com_clear_btn" label="{parentDocument.button_name}" click="outerDocument.func(data);" />


長々とお付き合い頂き本当に申し訳ありませんでした。
おかげさまで、お教え頂いたComponent内にコードを書く方法と一緒に、やりたいことが実現できます。
ありがとうございました。

sai_vowm
sai_vowm
投稿日時: 2012-9-6 19:59
やや お馴染みさん
登録日: 2012-9-5
居住地:
投稿: 8
Re: DataGridColumnのitemRenderer内のButtonのラベルを動的に変更したい
すみません、追記です。

ButtonのparentDocument.button_nameは、
Sample.mxmlのinit();で値を動的に変更しています。

最初から通して読んでみたら、ものすごく解かりづらい説明で
あらためて申し訳ありません・・・。
Deyanさま、ありがとうございましたm(_ _)m
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を