Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-06-2009, 08:59   #1 (permalink)
Neuer User
 
Registriert seit: Jun 2009
Beiträge: 6
Post Radiobutton-Itemrenderer ->Problem mit RadioButtonGroup

Hallo zusammen,

ich hoffe ich bin an dieser Stelle hier richtig und mir kann jemand helfen.

Ich ersteller in einer mxml-Datei komplett mittels Actionscript ein dynamisches Datagrid, welches sich die Daten aus einer XML-Struktur holt. In diesem Datagrid sind Radiobuttons enthalten, welche mit Hilfe eines Itemrenderer erzeugt und anhand der Daten aus dem XML vorbelegt werden.
Schwierigkeit: Die Radiobuttons sollen splatenweise gruppiert werden, d.h. pro Spalte kann ein Radiobutton selektiert werden.
Mir ist bewusst, dass das mit der RadioButtonGroup zusammenhängt. Im Internet haben ich gelesen, dass ich die Buttongroup im Hauuptdokument erstellen muss und dann im Renderer darauf zugreifen und diese zuweisen sollte. Bei mir sieht es derzeit wie folgt aus. Das Grid wird erstellt und pro Spalte ist ein Radiobutton vorselektiert. Nun kann ich aber mit nur "1 Punkt" zwischen allen anderen nicht selektierten Buttons spaltenübergreifend hin- und herspringen und die vorselektierten Buttons bleiben völlig unberührt.

Weiß vielleicht jemand Rat und kann mir bei der Lösung des Problems helfen? Hab schon eine ganze Menge probiert, aber die 100%ig richtige Lösung habe ich leider noch nicht zusammengebaut bekommen.

Schonmal vielen Dank für eure Hilfe,
Christin

Anbei mal mein Quellcode zum besseren Verständnis.

CheckboxRenderer
Code:
package
{
   import mx.controls.CheckBox;

   
   public class CheckboxRenderer extends CheckBox
   {

      public function CheckboxRenderer()
      {
         super ();
      }
      
      override protected function createChildren():void
      {
         super.createChildren();
      }

      override protected function commitProperties():void
      {
         super.commitProperties();
          if (this.data)
          {
              this.selected = this.data.@value == "true";   
          }
          else
          {
             this.selected = false;
          }
      }



   }
}
RadioButtonRenderer
Code:
package
{
   import mx.controls.RadioButton;
   
   public class RadioButtonRenderer extends RadioButton
   {
      public function RadioButtonRenderer()
      {
         super();
      }
      
      override protected function createChildren():void
      {
         super.createChildren();
      }

      override protected function commitProperties():void
      {
         super.commitProperties();
          if (this.data)
          {
             var i:int  = this.listData.columnIndex;
             this.group = this.parentApplication.groups_stückliste[i];
             this.selected = this.listData.label == "true"   
          }
          else
          {
             this.selected = false;
          }
      }

   }
}
Christin85 ist offline   Mit Zitat antworten
Alt 08-06-2009, 09:02   #2 (permalink)
Neuer User
 
Registriert seit: Jun 2009
Beiträge: 6
Post MXML-Datei

Aufgrund der Zeichenbegrenzung muss ich die mxml-Datei leider trennen ...

Variablen und Imports
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" >
<mx:Script>
   <![CDATA[
      import mx.controls.RadioButtonGroup;
      import mx.controls.Label;
      import mx.controls.NumericStepper;
      import mx.controls.Text;
      import mx.controls.TextArea;
      import mx.controls.CheckBox;
      import mx.controls.RadioButton;
      import mx.controls.Button;
      import mx.collections.XMLListCollection;
      import mx.collections.ArrayCollection;
      import mx.controls.dataGridClasses.DataGridColumn;
      import mx.controls.DataGrid;
      import mx.containers.TabNavigator;
      import mx.containers.Canvas;
      import mx.rpc.http.HTTPService;
      import mx.rpc.events.ResultEvent;
      
      public var grid_bemerkungen : DataGrid = new DataGrid();
      public var grid_stückliste : DataGrid = new DataGrid();
      public var grid_pyro : DataGrid = new DataGrid();
      public var grid_versuch : DataGrid = new DataGrid();
      public var column_bemerkung : DataGridColumn;
      public var column_name : DataGridColumn;
      public var column_value : DataGridColumn;
      public var column_generator : DataGridColumn;
      public var column_liste : DataGridColumn;
      public var column_versuch : DataGridColumn;
      public var column: DataGridColumn;
      public var tab : TabNavigator = new TabNavigator();
      public var cont1 : Canvas = new Canvas();
      public var cont2 : Canvas = new Canvas();
      public var cont3 : Canvas = new Canvas();
      public var cont4 : Canvas = new Canvas();
      public var daten : HTTPService = new HTTPService();
      public var entries:XML;
      public var length:int;
      public var newColumns_bemerkung:Array = new Array();
      public var newColumns_stückliste:Array = new Array();
      public var newColumns_pyro:Array = new Array();
      public var newColumns_versuch:Array = new Array();
      public var newColumns_header_stückliste:Array = new Array();
      public var newColumns_header_versuch:Array = new Array();
      public var aenderungen_cont1:Button = new Button;
      public var aenderungen_cont2:Button = new Button;
      public var aenderungen_cont3:Button = new Button;
      public var aenderungen_cont4:Button = new Button;
      //public var myVars:Object = new Object();
      public var groups_stückliste:Array = new Array();

...
Christin85 ist offline   Mit Zitat antworten
Alt 08-06-2009, 09:02   #3 (permalink)
Neuer User
 
Registriert seit: Jun 2009
Beiträge: 6
Post MXML-Datei II

und hier der Rest ...

Code:
...

      public var  xml_pyro:XML = new XML(      
      <pyro_stück>
         <zuordnung text="Stückliste1 | Pyro1" value="false"/>
         <zuordnung text="Stückliste1 | Pyro2" value="true"/>      
      </pyro_stück>);
      public var  xml_stückliste:XML = new XML(      
      <stückliste>
         <info anzahl="3" generator1="Generator XY" generator2="Generator YZ" generator3="Generator VW"/>
         <liste text="Stückliste1 | Pyro1" generator1="true"  generator2="false"  generator3="true"/>
         <liste text="Stückliste1 | Pyro2" generator1="false" generator2="false" generator3="false"/>
         <liste text="Stückliste2 | Pyro1" generator1="false" generator2="true" generator3="false"/>
         <liste text="Stückliste2 | Pyro2" generator1="false" generator2="false" generator3="false"/>
      </stückliste>);
      public var  xml_versuch:XML = new XML(      
      <versuchsliste>
         <info anzahl="3" versuch1="Versuch1" versuch2="Versuch2" versuch3="Versuch3"/>
         <generator  name="Generator XY" versuch1="true" versuch2="true" versuch3="true"/>
         <generator name="Generator YZ"  versuch1="false" versuch2="false" versuch3="false"/>
         <generator name="Generator VW"  versuch1="false" versuch2="false" versuch3="false"/>
      </versuchsliste>);
      public var  xml_bemerkung:XML = new XML(   
      <bemerkungsliste>
         <generator bezeichnung="Generator XY" bemerkung="Hier steht eine Bemerkung"/>
         <generator bezeichnung="Generator YZ" bemerkung=""/>
         <generator bezeichnung="Generator VW" bemerkung="Hier steht auch eine Bemerkung"/>
      </bemerkungsliste>);
      
      private function init() : void{

         tab.percentWidth=100;
         tab.percentHeight=100;
         cont1.label = "Stücklisten zu Pyrotechnik";
         cont2.label = "Stücklistenzuordnnung";
         cont3.label = "Versuchszuordnung";
         cont4.label = "Bemerkungen";
         
         //Stücklisten zu Pyrotechnik
         grid_pyro.dataProvider=xml_pyro.zuordnung;
         grid_pyro.percentWidth=75;
         column_name = new DataGridColumn();
         column_value = new DataGridColumn();
         column_name.dataField="@text";
         var CheckRenderer:ClassFactory = new ClassFactory(CheckboxRenderer);
           column_value.itemRenderer= CheckRenderer;
         newColumns_pyro.push(column_name);
         newColumns_pyro.push(column_value);
         grid_pyro.columns = newColumns_pyro;
         grid_pyro.showHeaders = false;
         grid_pyro.y =40;
         aenderungen_cont1.label= "Änderungen übernehmen";
         aenderungen_cont1.x = 10;
         aenderungen_cont1.y = 5;
         cont1.addChild(aenderungen_cont1);
         cont1.addChild(grid_pyro);
         
         
         //Stücklistenzuordnung
         // *********** Header-Texte ******************         
         var grid_header_stückliste:DataGrid = new DataGrid();
         grid_header_stückliste.dataProvider = xml_stückliste.info;
         grid_header_stückliste.percentWidth=75;
         column_liste = new DataGridColumn();
         column_liste.headerText ="";
         column_liste.dataField ="@text"
         newColumns_header_stückliste.push(column_liste);
         length = xml_stückliste.info.@anzahl;
         for ( var i:int =1;i<=length;i++){
            column = new DataGridColumn();
            column.dataField = "@generator"+i;
            column.setStyle("fontWeight", "bold");
            column.setStyle("textAlign", "center");
            newColumns_header_stückliste.push(column);
         }      
         grid_header_stückliste.columns = newColumns_header_stückliste;
         grid_header_stückliste.showHeaders = false;
         grid_header_stückliste.y =40;
         cont2.addChild(grid_header_stückliste);
         
         groups_stückliste.length = length;
         for ( var j:int =1;j<=length;j++){
            groups_stückliste[i] = new RadioButtonGroup();
         }
         
         // ************* Eigentliche Daten ******************
         grid_stückliste.dataProvider= xml_stückliste.liste;
         grid_stückliste.percentWidth=75;
         column_liste = new DataGridColumn();
         column_liste.headerText ="";
         column_liste.dataField ="@text"
         newColumns_stückliste.push(column_liste);
         for ( var i:int =1;i<=length;i++){
            column = new DataGridColumn();
            column.dataField = "@generator"+i;
            var RadioRenderer:ClassFactory = new ClassFactory(RadioButtonRenderer);
              column.itemRenderer= RadioRenderer;
              column.setStyle("textAlign", "center");
            newColumns_stückliste.push(column);
         }      
         grid_stückliste.columns = newColumns_stückliste;
         grid_stückliste.showHeaders = false;
         grid_stückliste.y =63;
         aenderungen_cont2.label= "Änderungen übernehmen";
         aenderungen_cont2.x = 10;
         aenderungen_cont2.y = 5;
         cont2.addChild(aenderungen_cont2);
         cont2.addChild(grid_stückliste);
         
         //Versuchszuordnung
         // *********** Header-Texte ******************
         var grid_header_versuch:DataGrid = new DataGrid();
         grid_header_versuch.dataProvider = xml_versuch.info;
         grid_header_versuch.percentWidth=75;
         column_versuch = new DataGridColumn();
         column_versuch.headerText ="";
         column_versuch.dataField ="@text"
         newColumns_header_versuch.push(column_versuch);
         length = xml_versuch.info.@anzahl;
         for ( var i:int =1;i<=length;i++){
            column = new DataGridColumn();
            column.dataField = "@versuch"+i;
            column.setStyle("fontWeight", "bold");
            column.setStyle("textAlign", "center");
            newColumns_header_versuch.push(column);
         }      
         grid_header_versuch.columns = newColumns_header_versuch;
         grid_header_versuch.showHeaders = false;
         grid_header_versuch.y =40;
         cont3.addChild(grid_header_versuch);
         // ************* Eigentliche Daten ******************
         grid_versuch.dataProvider= xml_versuch.generator;
         grid_versuch.percentWidth=75;
         column_versuch = new DataGridColumn();
         column_versuch.dataField ="@name"
         newColumns_versuch.push(column_versuch);
         for ( var l:int =1;l<=length;l++){
            column = new DataGridColumn();
            column.dataField = "@versuch"+l;
            var RadioRenderer:ClassFactory = new ClassFactory(RadioButtonRenderer);
              column.itemRenderer= RadioRenderer;
              column.setStyle("textAlign", "center");
            newColumns_versuch.push(column);
         }      
         grid_versuch.columns = newColumns_versuch;
         grid_versuch.showHeaders = false;
         grid_versuch.y =63;
         aenderungen_cont3.label= "Änderungen übernehmen";
         aenderungen_cont3.x = 10;
         aenderungen_cont3.y = 5;
         cont3.addChild(aenderungen_cont3);
         cont3.addChild(grid_versuch);
                  
         // Bemerkungen
         grid_bemerkungen.dataProvider = xml_bemerkung.generator;
         grid_bemerkungen.percentWidth = 75;
         column_name = new DataGridColumn();
         column_name.headerText ="Generator";
         column_name.dataField ="@bezeichnung"
         column_name.editable = false;
         column_bemerkung = new DataGridColumn();
         column_bemerkung.headerText ="Bemerkung";
         column_bemerkung.itemRenderer = new ClassFactory(mx.controls.TextArea);
         column_bemerkung.dataField="@bemerkung";
         newColumns_bemerkung.push(column_name);
         newColumns_bemerkung.push(column_bemerkung);      
         grid_bemerkungen.columns = newColumns_bemerkung;
         grid_bemerkungen.editable = true;
         grid_bemerkungen.y =40;
         aenderungen_cont4.label= "Änderungen übernehmen";
         aenderungen_cont4.x = 10;
         aenderungen_cont4.y = 5;
         cont4.addChild(aenderungen_cont4);
         cont4.addChild(grid_bemerkungen);
         
         tab.addChild(cont1);
         tab.addChild(cont2);
         tab.addChild(cont3);
         tab.addChild(cont4);
         addChild(tab);
            
      } 
       
   ]]>
</mx:Script>
</mx:Application>
Christin85 ist offline   Mit Zitat antworten
Alt 08-06-2009, 09:13   #4 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Hi,

ich glaube nicht, dass sich jemand den gesamten Code durchlesen wird, ist ja ziemlich viel. ;-)

Kannst Du das Problem vielleicht etwas verklenern?
Nico B. ist offline   Mit Zitat antworten
Alt 08-06-2009, 09:22   #5 (permalink)
Neuer User
 
Registriert seit: Jun 2009
Beiträge: 6
Post

Ich glaub viel Kürzer geht wirklich nicht ... der RadioButtonRenderer steht ja im Post oben ...

Danke und Grüßle
Christin

Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" >
<mx:Script>
	<![CDATA[
		import mx.controls.RadioButtonGroup;
		import mx.controls.RadioButton;
		import mx.collections.XMLListCollection;
		import mx.collections.ArrayCollection;
		import mx.controls.dataGridClasses.DataGridColumn;
		import mx.controls.DataGrid;
		
		public var grid_stückliste : DataGrid = new DataGrid();
		public var column_liste : DataGridColumn;
		public var column: DataGridColumn;
		public var length:int;
		public var newColumns_stückliste:Array = new Array();
		public var groups_stückliste:Array = new Array();
		
		public var  xml_stückliste:XML = new XML(		
		<stückliste>
			<info anzahl="3" generator1="Generator XY" generator2="Generator YZ" generator3="Generator VW"/>
			<liste text="Stückliste1 | Pyro1" generator1="true"  generator2="false"  generator3="true"/>
			<liste text="Stückliste1 | Pyro2" generator1="false" generator2="false" generator3="false"/>
			<liste text="Stückliste2 | Pyro1" generator1="false" generator2="true" generator3="false"/>
			<liste text="Stückliste2 | Pyro2" generator1="false" generator2="false" generator3="false"/>
		</stückliste>);
		
		private function init() : void{

			grid_stückliste.dataProvider= xml_stückliste.liste;
			grid_stückliste.percentWidth=75;
			column_liste = new DataGridColumn();
			column_liste.headerText ="";
			column_liste.dataField ="@text"
			newColumns_stückliste.push(column_liste);
			length = xml_stückliste.info.@anzahl;
			for ( var i:int =1;i<=length;i++){
				column = new DataGridColumn();
				column.dataField = "@generator"+i;
				var RadioRenderer:ClassFactory = new ClassFactory(RadioButtonRenderer);
  				column.itemRenderer= RadioRenderer;
  				column.setStyle("textAlign", "center");
				newColumns_stückliste.push(column);
			}		
			grid_stückliste.columns = newColumns_stückliste;
			grid_stückliste.showHeaders = false;
			grid_stückliste.y =63;

			addChild(grid_stückliste);
				
		} 
     	
	]]>
</mx:Script>
	
</mx:Application>

Geändert von Christin85 (08-06-2009 um 11:58 Uhr) Grund: Verkürzung Quellcode
Christin85 ist offline   Mit Zitat antworten
Alt 09-06-2009, 07:20   #6 (permalink)
Neuer User
 
Registriert seit: Jun 2009
Beiträge: 6
Post

Guten Morgen,

ich hab es jetzt soweit geschafft, meinen RadioButtonRenderer anzupassen, dass die RadioButtons spaltenweise gruppiert sind (Durchklicken funktioniert).
Nur leider greift jetzt die Vorbelegung nicht mehr ...

Code:
package
{
	import mx.controls.RadioButton;
	
	public class RadioButtonRenderer extends RadioButton
	{
		public function RadioButtonRenderer()
		{
			super();
		}
		
		override protected function createChildren():void
		{
			super.createChildren();
		}

		override protected function commitProperties():void
		{
			var i:int = this.listData.columnIndex;
			this.group = this.parentApplication.groups_stückliste[i];
		    if (this.data)
		    {	
		    		this.selected = this.listData.label == "true";	
		    }
		    else
		    {
		    	this.selected = false;
		    }
		}

	}
}
Weiß denn niemand Rat?
Christin85 ist offline   Mit Zitat antworten
Alt 09-06-2009, 10:53   #7 (permalink)
Neuer User
 
Registriert seit: Jun 2009
Beiträge: 6
Exclamation

So, ich hab mir dann mal selbst geholfen, da ja niemand antwortet ...

Für alle die, die an der Lösung interessiert sind, hier der funktionierende RadioButtonRenderer

Code:
package
{
	import flash.events.MouseEvent;
	import mx.controls.RadioButton;
	import mx.controls.listClasses.BaseListData;
	import mx.controls.listClasses.IDropInListItemRenderer;
	
	public class RadioButtonRenderer_Liste extends RadioButton implements IDropInListItemRenderer
	{
   		private var _listData:BaseListData;
   		private var _data:Object;
   		
		public function RadioButtonRenderer_Liste()
		{
			super();
		}
		
		override public function get listData():BaseListData
		{
			return this._listData;
		}

		override public function set listData(value:BaseListData):void
		{
			this._listData = value;
			invalidateProperties();
		}
		
        override public function set data( value:Object ) : void 
        { 
            _data = value; 
             
            if( value ) 
            { 
                this.selected=this.listData.label=="true";
            }
        }
		
		override protected function createChildren():void
		{
			super.createChildren();
		}

		override protected function commitProperties():void
		{
			var i:int = this.listData.columnIndex;
			this.group = this.parentApplication.groups_stückliste[i];

		}

	}
}
Christin85 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
actionscript, datagrid, itemrenderer, radiobutton, radiobuttongroup

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele