2010-07-20 1 views
0

Я создал форму динамически, добавив каждый компонент в скрипт действия, Теперь я хочу вернуть текст/данные, введенные в этот компонент динамически?Как читать данные динамической формы Ребенок в Flex?

private function loadAllComponents():void 
     { 
      var formItemArray:Array = new Array(); 

      for(var i:int=0; i< Application.application.designList.length; i++)//which had the colonName, colComponet to be dispalyed, 
      { 
       var fm:FormItem = new FormItem(); 

       fm.label = Application.application.designList.getItemAt(i).colName; 

       var comp:String = Application.application.designList.getItemAt(i).component; 

       switch(comp) 
       { 
        case "TextBox": 
         var ti:TextInput = new TextInput(); 
         ti.id = Application.application.designList.getItemAt(i).component; 
         fm.addChild(ti); 
        break; 

        case "TextArea": 
         var ta:TextArea = new TextArea(); 
         ta.id = Application.application.designList.getItemAt(i).colName; 
         fm.addChild(ta);       
        break; 

        case "ComboBox": 

         var mycb:myComboBox = new myComboBox();              
         mycb.getAllMasterCBData(Application.application.selectedgridItem, Application.application.designList.getItemAt(i).colName);              
         fm.addChild(mycb); 

        break; 

        case "DateField": 
         var df:DateField = new DateField(); 
         df.id = Application.application.designList.getItemAt(i).component; 
         fm.addChild(df); 
        break; 
       } 
       myform.addChild(fm);     
      } 

     } 

    private function saveToDb():void // Here i wan to read all the formdata 
    {    
     var formItems:Array = myform.getChildren(); 

     for each (var item:UIComponent in formItems) 
     { 
      if (item is TextInput) 
      {   
       var text:String = Object(item).text;  

       Alert.show("came here");  
      } 
      else if (item is DateField) 
      { 
       var date:Date = DateField(item).selectedDate;         
      } 
     } 
    } 

    ]]> 
</mx:Script> 

<mx:Form id="myform" cornerRadius="5" borderColor="#B7BABC" borderStyle="solid" width="100%" height="100%" /> 

<mx:HBox width="100%" height="100%" > 
    <mx:Spacer width="120"/> 
    <mx:Button label=" Save " id="saveBtn" click="saveToDb()" />  
</mx:HBox> 
+0

вместо редактирования мой вопрос, плз ответ, так что я буду более –

+0

я благодарностью было ответить; и вы сомневаетесь в неправильном форматировании, что затруднило бы мне (и другим) прочитать его. – JeffryHouser

ответ

0

Вы создаете входные компоненты в ActionScript, но на основе этого кода вы не создаете их динамически; вы просто жестко их кодируете. С помощью данного образца вы будете знать компоненты, которые вы создаете во время компиляции.

Вам нужно будет сохранить ссылку на созданные вами элементы формы; сделать их общедоступными переменными вместо локальных переменных «var». Вроде как это:

protected var ti:TextInput ;  
protected var ta:TextArea ;   
protected var df:DateField; 

Тогда в вашем методе создания, сделать что-то вроде этого:

ti = new TextInput();  
ti.id = Application.application.designList.getItemAt(i).component; 
fm.addChild(ti); 

ta = new TextArea();   
ta.id = Application.application.designList.getItemAt(i).colName; 
fm.addChild(ta);  

df = new DateField(); 
df.id = Application.application.designList.getItemAt(i).component; 
fm.addChild(df); 

myform.addChild(fm); 

Затем, когда вам нужно получить доступ к ним, просто сделать что-то вроде этого:

private function getMyformData() 
{ 
     ti.text; 
     ta.text; 
} 

Если вы генерируете компоненты формы во время выполнения на основе данных, затем сохраняйте элементы формы в каком-либо массиве.

Вы также можете что-то сделать, перевернув все дочерние элементы вашего контейнера, хотя это был бы не мой первый подход.


С момента публикации более полного кода; вот некоторые дополнения. Я добавил защищенный массив всех элементов формы и каждого блока «switch»; новый элемент ввода помещается в массив.

<mx:Script> 
protected var itemsArray : Array = new Array(); 
private function loadAllComponents():void 
    { 
     var formItemArray:Array = new Array(); 

     for(var i:int=0; i< Application.application.designList.length; i++)//which had the colonName, colComponet to be dispalyed, 
     { 
      var fm:FormItem = new FormItem(); 

      fm.label = Application.application.designList.getItemAt(i).colName; 

      var comp:String = Application.application.designList.getItemAt(i).component; 

      switch(comp) 
      { 
       case "TextBox": 
        var ti:TextInput = new TextInput(); 
        ti.id = Application.application.designList.getItemAt(i).component; 
        fm.addChild(ti); 
        itemsArray.push(ti) 
       break; 

       case "TextArea": 
        var ta:TextArea = new TextArea(); 
        ta.id = Application.application.designList.getItemAt(i).colName; 
        fm.addChild(ta);       
        itemsArray.push(ta) 
       break; 

       case "ComboBox": 

        var mycb:myComboBox = new myComboBox();              
        mycb.getAllMasterCBData(Application.application.selectedgridItem, Application.application.designList.getItemAt(i).colName);              
        fm.addChild(mycb); 
        itemsArray.push(mycb) 

       break; 

       case "DateField": 
        var df:DateField = new DateField(); 
        df.id = Application.application.designList.getItemAt(i).component; 
        fm.addChild(df); 
        itemsArray.push(df) 
       break; 
      } 
      myform.addChild(fm);     
     } 

    } 

Метод sateToDb изменится быть что-то вроде этого:

private function saveToDb():void // Here i wan to read all the formdata 
{    
    var formItems:Array = myform.getChildren(); 

    for each (var item:UIComponent in itemsArray) 
    { 
     if (item is TextInput) 
     {   
      var text:String = Object(item).text;  

      Alert.show("came here");  
     } 
     else if (item is DateField) 
     { 
      var date:Date = DateField(item).selectedDate;         
     } 
    } 
} 

    ]]> 
</mx:Script> 
+0

прошу вас сказать мне ясно? Вначале у меня нет ссылки на получение этих компонентов, кроме имени формы? , то как я могу получить все данные из всех компонентов, которые я добавил во время выполнения? –

+0

Как и в коде в моем ответе; сделать эти элементы формы защищенными [или общедоступными или частными] переменными, а метод getMyFormData() может получить к ним доступ по имени переменной. Все компоненты, по сути, добавлены во время выполнения, и вы можете получить к ним доступ одинаково [по их идентификатору переменной] – JeffryHouser

+0

Yah Just i отправил весь мой точный код, можно ли просмотреть один раз? –

0

Отредактировано Ответ:

ОК, я думаю, я вижу проблему.

Вы добавляете свои элементы управления данными в FormItems и добавляете их в форму. Но потом вы повторяете детей Формы и, как если бы они были элементами управления данными, а не FormItems.

Без комментариев на остальной части кода, посмотрите на то, что эта обновленная функция делает для извлечения элементов управления данными:

 private function saveToDb():void 
     { 
      var formItems:Array = myform.getChildren(); 

      for each (var item:FormItem in formItems) 
      { 
       var itemChildren:Array = item.getChildren(); 
       for each (var control:UIComponent in itemChildren) 
       { 
        if (control is TextInput) 
        { 
          var text:String = Object(item).text; 
          Alert.show("TextInput"); 
        } 
        else if (control is DateField) 
        { 
          var date:Date = DateField(item).selectedDate; 
          Alert.show("Date"); 
        } 
       } 
      } 

Вы можете удалить переменную formItemArray тоже, это не требуется, так как мы» re получить список детей из формы и FormItems.


Оригинальный ответ:

Если вы сохранить ссылку на каждый из динамических элементов формы в массиве вы можете перебирать каждый из них в вашей getMyFormData() функции.

например.

protected var formItems:Array = new Array(); 

// Other class stuff here... 

var ti:TextInput = new TextInput();  
ti.id = Application.application.designList.getItemAt(i).component; 
formItems.push(ti); // Add item to array. 
fm.addChild(ti); 

var ta:TextArea = new TextArea();   
ta.id = Application.application.designList.getItemAt(i).colName; 
formItems.push(ta); // Add item to array. 
fm.addChild(ta);  

var df:DateField = new DateField(); 
df.id = Application.application.designList.getItemAt(i).component; 
formItems.push(df); // Add item to array. 
fm.addChild(df); 

myform.addChild(fm); 


<mx:button click="getMyformData()"/> 

private function getMyformData() 
{ 
    //How to get the myform Data dynamically here after validations... ? & 
    for each (var item:UIComponent in formItems) 
    { 
     if (item is TextInput || item is TextArea) 
     { 
      // Cast to Object to access the 'text' property without the compiler complaining. 
      var text:String = Object(item).text; 
      // Do something with the text... 
     } 
     else if (item is DateField) 
     { 
      var date:Date = DateField(item).selectedDate; 
      // Do something with the date... 
     } 
     // Insert additional type checks as needed. 
    } 
} 

Вы должны решить, что делать с данными по своему усмотрению, хотя :)

Если вы используете отдельный список убедитесь, что вы очистить от formItems массива, когда вы закончите с ним, чтобы у вас не было ссылок на предметы, которые они не имели в памяти.

Вместо того, чтобы хранить отдельный массив элементов формы, вы также можете перебирать детей в контейнере fm. Возможно, вам придется сделать некоторые предположения относительно детей, к которым вы будете обращаться, но похоже, что у вас есть контроль над всеми добавляемыми детьми, так что это не проблема.

Я надеюсь, что помогает ...

:)

+0

Я не получаю данные (текст) от компонентов для каждого, Я предполагаю, что нам нужно путешествовать до ребенка formitem и получать данные от моего ребенка -am я? –

+0

Вам нужно убедиться, что массив 'formItems' остается в области видимости. Можете ли вы опубликовать более конкретный пример? В приведенном выше примере слишком много предположений о структуре проекта, чтобы иметь возможность правильно определить проблему. –

+0

Yah Just Я написал весь мой точный код, можно ли просмотреть один раз? –

Смежные вопросы