2012-06-06 70 views
0

我有一個問題,一直在推動我瘋了。我在Flex中動態創建一個表使用下面的代碼:動態創建的Flex表單只能識別最後添加的複選框作爲複選框

private function init():void { 
      //Dynamically create form based on profiles 
      for each(var role:AclRoleDTO in _profiles) { 
       //Create form item 
       var fi:FormItem = new FormItem(); 
       fi.label = role.name; 

       //Create checkbox 
       var cbx:CheckBox = new CheckBox(); 
       cbx.id = "role_"+role.id.toString(); 
       cbx.label = role.description; 
       cbx.width = 250; 
       cbx.selected = true; 

       //Add Checkbox for form item 
       fi.addChild(cbx); 
       profileForm.addChild(fi); 
      } 

      //Add save button 
      var fib:FormItem = new FormItem(); 
      var btn:Button = new Button(); 
      btn.name = "Save"; 
      btn.label = "Save"; 
      btn.id  = "saveButton"; 

      btn.addEventListener(MouseEvent.CLICK, onSubmitClicked); 

      fib.addChild(btn); 

      profileForm.addChild(fib); 
     } 

能正常工作並與FormItems包括基於可用情景+的CheckBox創建一個窗體保存按鈕來保存這些文件。

但是,當用戶點擊Save按鈕保存配置文件,我用下面的方法來檢索選擇框,但功能只承認最後添加的CheckBox作爲複選框...

private function onSubmitClicked(event:MouseEvent):void { 
      var formElements:Array = profileForm.getChildren(); 
      var roleIds:ArrayCollection = new ArrayCollection(); 
      var i:int = 0; 
      var j:int = 0; 

      //Parse the entire form 
      for (i; i < formElements.length; i++) { 

       if (formElements[i] is FormItem) { 
        var formItem:FormItem = formElements[i]; 
        var itemElements:Array = formItem.getChildren(); 

        for (j;j<itemElements.length;j++) { 

         //If form item is a checkbox, check if the box is checked! 
         if (itemElements[j] is CheckBox) { 
          var tmpBox:CheckBox = itemElements[j]; 

          if (tmpBox.selected) { 
           //random stuff 
          } 
         } 
        } 
       } 
      } 

      //Send event with roleIds! 
      //More random stuff 

     } 

我已經嘗試了各種各樣的事情,以確保循環正常工作,它確實:它循環適當數量的FormItem元素並檢索適當數量的childrenElements。它只是不識別任何孩子作爲複選框,而不是循環通過添加的最後一個FormItem。如果我使用flash.utils.getQualifiedClassName(itemElements [j])來查找其他FormItem子項是什麼,它將返回一個空字符串。

我在做什麼錯?

回答

2

這裏是工作的代碼爲您的問題:

 private function onSubmitClicked(event:MouseEvent):void 
     { 
      var selectedRoles:ArrayCollection = new ArrayCollection(); 

      var formItems:Array = rolesForm.getChildren(); 

      for (var i:int = 0; i < formItems.length; i++) 
      { 
       var formItem:FormItem = formItems[i]; 
       var formItemElements:Array = formItem.getChildren(); 
       for each (var control:UIComponent in formItemElements) 
       { 
        if (control is CheckBox) 
        { 
         var tempBox:CheckBox = control as CheckBox; 

         if(tempBox.selected) 
          selectedRoles.addItem(tempBox); 
        } 
       } 
      } 
     } 
+0

謝謝,顯然這是做的伎倆,雖然我不明白爲什麼我不得不通過項目作爲UIComponent它的工作。 – Deratrius

+1

這是使用MX Form的方法。 RIAStar的例子是Spark。 我建議閱讀Bill White的文章Core Flex 4 Elements vs Children。 http://www.billdwhite.com/wordpress/?p=296 UIComponent類是所有Flex可視組件的基類,因此您將formItemElement投射爲UIComponent。 –

+1

@Deratrius這段代碼和你的代碼之間的唯一區別(就我所知)是'j'變量。你有一個雙循環,並且從不在外循環中將'j'設回'0'。FinFlex使用'for each'循環來解決問題。 – RIAstar

0

我現在無法真正解決這個問題,但爲什麼不簡單地引用數組中的CheckBox?這將是一個快速簡單的解決方法。您還可以從平面層次中受益,從而使訪問更加輕鬆(而且速度更快,在大多數情況下這並不重要)。

+0

是的,這不是一個壞主意,我想我可以直接訪問每個CheckBox。 FinFlex的答案解決了我的問題,所以我不需要試試這個。儘管感謝您的幫助! – Deratrius

0

假設這是FLEX4 /星火:原因是你正在使用的組件,而不是「元素」的原始「孩子」。使用Spark體系結構中的容器時,應始終使用元素(使用numElementsgetElementAt()而不是getChildren()addChild())。 'children'方法僅用於Spark組件內部;您永遠不應該使用它們將元素添加到容器。

因此,如果您將addChild()的每次出現替換爲addElement(),您的問題將得到解決。而onSubmitClicked()方法可以是這個樣子:

for (var i:int = 0; i < profileForm.numElements; i++) { 
     var formItem:FormItem = profileForm.getElementAt(i) as FormItem; 
     if (formItem) { 
      var cb:CheckBox = formItem.getElementAt(0) as CheckBox; 
      trace(cb); //null if it's not a CheckBox 
     } 
    } 

話雖這麼說,我看不出有任何理由,你爲什麼會想動態創建這種形式。如果您需要的是複選框列表,請創建一個List,並自定義ItemRenderer,它的CheckBox_profiles設置爲dataProvider

+0

謝謝,試過你的代碼,但它沒有奏效。要回答你爲什麼我沒有使用ItemRenderer的問題,我想我沒有一個合理的理由,除了我沒有想到它,我習慣了HTML表單,我也只是通過項目循環並添加一個複選框爲他們每個人。 – Deratrius