Volledige versie bekijken : Datagrid en datefield vraagjes
reyntjensw
%Europe/Berlin %946 %2008, 22:43
Hallo iedereen,
Ik zit met enkele flex vraagjes :
- als ik een datefield in mijn datagrid steek zou ik graag mijn datum formatten, de format function heb ik hier niet kunnen gebruiken. Ik zou graag (DD/MM/YYYY) in mijn datefield krijgen.
<mx:DataGridColumn headerText="Datum" dataField="date" itemEditor="mx.controls.DateField" id="Datetxt" />
formatString="DD/MM/YYYY" kon ik spijtig genoeg niet gebruiken
- Hoe krijg ik daar de datum van vandaag in? Momenteel doe ik het als volgt( zie hieronder), ik steek er null in anders crashed het datefield.
dgExpenses.dataProvider.addItem({mycashflow_id:0, name: "", date: null, amount: 0});
- Als welk datatype sla ik dit het best op in mijn sqlite db? Als een string of als een date?
Bedankt
TheDutch
%Europe/Berlin %198 %2008, 04:46
Label functie gebruiken in combinatie met date formatter :).
Wubinator
%Europe/Berlin %488 %2008, 11:43
Toevallig paar dagen geleden mee bezig geweest. Heb een ActionScript class LabelFunctions geschreven met daarin:
/**
* Creates the default label function for Date
*/
public static function dateLabel(item:Object, column:Object):String {
/*
Create a date formatter and set the formatString for date
*/
var dateFormatter:DateFormatter = new DateFormatter();
dateFormatter.formatString = "DD/MM/YYYY";
return dateFormatter.format(item[column.dataField]);
}
Vervolgens heb je in je DataGridColumn:
<mx:DataGridColumn dataField="executionDate"
headerText="Uitv.Datum"
labelFunction="{LabelFunctions.dateLabel}"
width="75" />
De datum van vandaag is new Date();
reyntjensw
%Europe/Berlin %810 %2008, 19:26
Ik heb mijn code aangepast naar de volgende:
<mx:DataGridColumn headerText="Datum" dataField="date" id="Datetxt" itemEditor="mx.controls.DateField" labelFunction="{LabelFunctions.dateLabel}" />
Maar ik krijg nog altijd volgende error TypeError: Error #1034: Type Coercion failed: cannot convert "12/01/2008" to Date.
Ik krijg deze error bij het bewerken van een cell. In mijn db staat het datatype op date
LLMM
%Europe/Berlin %395 %2008, 09:29
<mx:DataGridColumn headerText="Datum" dataField="date" id="Datetxt" itemEditor="mx.controls.DateField" labelFunction="dateLabel" />
je moet het zo schrijven ... dacht ik !
Sjoedzj
%Europe/Berlin %484 %2008, 11:37
Hij heeft een actionscript class met die labelFunction erin dus dat is niet het probleem. Het datumveld bevat nu een string ipv een Date object, waarschijnlijk moet je bij een change-event je String weer terugschrijven naar een Date object.
Wubinator
%Europe/Berlin %609 %2008, 14:38
Ik heb geen itemEditor="mx:controls.DateField" in mijn DataGridColumn staan. vandaar dat ik die foutmelding niet krijg.
Sjoedzj
%Europe/Berlin %660 %2008, 15:51
Dat zal wel de rede van die error zijn... Als je de datum wijzigt, wil de datagrid die String naar een Data object casten en dat gaat niet.
reyntjensw
%Europe/Berlin %938 %2008, 22:31
Thanks, problem is bijna solved:).
Maar zit nog met een klein foutje, als ik een nieuw item wil toevoegen, dan krijg ik een illegal default value for type Date.
Ik maak gebruik van deze classe
package classes { public class NewExpense { public var mycashflow_id:int; public var name:String; public var date:Date; public var amount:Number; public function NewExpense( name:String="", date:Date=11/11/2008, amount:Number=0.0) { this.name = name; this.date = date; this.amount = amount; } } }
en om iets toe te voegen in deze classe te steken doe ik het volgende:
var newExpense:NewExpense = new NewExpense(dgExpenses.selectedItem.name, dgExpenses.selectedItem.date, dgExpenses.selectedItem.amount); createRecord(newExpense);
Wat doe ik precies fout?
Thanks
Wubinator
%Europe/Berlin %387 %2008, 09:17
In de class staat dat je als argument een default datum hebt staan "date:Date=11/11/2008".
Als je =11/11/2008 weg haalt zal ie het doen. Hij kan die tekst niet omzetten naar een datum. Flex weet niet hoe dat vertaald moet worden
reyntjensw
%Europe/Berlin %468 %2008, 11:14
ALs ik die = 11/11/2008 weghaal krijg ik een error 1138 : Required parameters are not permitted after optional parameters.
Enig idee wat ik mis doe?
Sjoedzj
%Europe/Berlin %545 %2008, 13:06
maak er dan ipv 11/11/2008 new Date(2008, 10, 11) van (denk eraan dat maanden van 0-11 lopen)
reyntjensw
%Europe/Berlin %858 %2008, 20:36
Beste sjoedzj,
Ik heb het nu naar dit aangepast name:String="", date:Date = new Date(2008,10,10) , amount:Number=0.0
Maar ik krijg nog altijd de volgende error : 1047 : Parameter initializer unknow or is not a compile-time constant.
Sjoedzj
%Europe/Berlin %515 %2008, 12:22
probeer dit anders eens:
public function NewExpense( name:String="", date:Date=null, amount:Number=0.0){
if(date == null){
this.date = new Date(2008, 10, 11);
}else{
this.date = date;
}
}
reyntjensw
%Europe/Berlin %834 %2009, 20:01
Dit lijk te werken, bedankt. Nog 1 laatste vraag hoe krijg ik de datum van vandaag op de kortste manier?
Edit : wat ik merk is het volgende :
In men db heb ik een veld date van het type date. Als hij hierin een date opslaat is het onder het formaat van 2454780.5. Hoe zorg ik ervoor dat hij er een deftige datum erin steek van het formaat YYYY-MM-DD?
Sjoedzj
%Europe/Berlin %690 %2009, 16:34
huidige datum is new Date();
En de manier waarop een date-object opgeslagen wordt in je database heeft volgens mij te maken met je database instellingen.
reyntjensw
%Europe/Berlin %730 %2009, 17:32
Het begint te lukken, kan je me wel eens zeggen hoe flex de datum maakt.
Is dit YYYY/MM/DD of YYYY/DD/MM?
thx
Sjoedzj
%Europe/Berlin %442 %2009, 10:36
je kunt met behulp van een DateFormatter de datum in een willekeurig formaat zetten... Kijk anders even in de api:
http://livedocs.adobe.com/flex/3/langref/index.html
Pilekes
%Europe/Berlin %626 %2009, 15:01
Hoe ziet je code er nu uit reyntjensw?
Ik zou ook namelijk graag in mijn grid een editable veld met datepicker willen gebruiken, met format dd-mm-yyyy, maar ik krijg alleen maar foutmeldingen zodra ik het veld verlaat...
reyntjensw
%Europe/Berlin %631 %2009, 15:09
Beste Pilekes,
Ik heb er momenteel nog niet aan verder gedaan. Ik zit momenteel met examens, daarmee. Mocht je een oplossing hebben, laat het me gerust weten.
Sjoedzj
%Europe/Berlin %647 %2009, 15:31
zo werkt dat:
<mx:Script>
<![CDATA[
private function labelFunc(item:Object, o:Object):String {
if (item.date == null) {
return "";
}
return formatter.format(item.date);
}
]]>
</mx:Script>
<mx:DataGrid dataProvider="{}">
<mx:columns>
<mx:DataGridColumn itemEditor="mx.controls.DateField" dataField="date" labelFunction="labelFunc"/>
</mx:columns>
</mx:DataGrid>
Je moet alleen een dataprovider aangeven voor je datagrid en in dateField="date" moet je date vervangen door het attribute wat bij jou de datum is.
Pilekes
%Europe/Berlin %651 %2009, 15:38
zo werkt dat:
<mx:Script>
<![CDATA[
private function labelFunc(item:Post, o:Object):String {
if (item.date == null) {
return "";
}
return formatter.format(item.date);
}
]]>
</mx:Script>
<mx:DataGrid dataProvider="{}">
<mx:columns>
<mx:DataGridColumn itemEditor="mx.controls.DateField" dataField="date" labelFunction="labelFunc"/>
</mx:columns>
</mx:DataGrid>
Je moet alleen een dataprovider aangeven voor je datagrid en in dateField="date" moet je date vervangen door het attribute wat bij jou de datum is.
Bedankt voor de snelle reactie!
Ik krijg enkel op die code de volgende foutmelding:
Severity and Description Path Resource Location Creation Time Id
1046: Type niet gevonden of geen constante bij compilatie. Post. Datagrid/src Datagrid.mxml line 141 1232375800493 827
Sjoedzj
%Europe/Berlin %660 %2009, 15:50
Sorry, ik heb een foutje gemaakt...
<mx:Script>
<![CDATA[
public function getRenderer():IFactory{
var factory:ClassFactory = new ClassFactory(DateField);
factory.properties = {formatString: 'DD-MM-YYYY'};
return factory;
}
]]>
</mx:Script>
<mx:DataGrid dataProvider="{mainModel.posts}">
<mx:columns>
<mx:DataGridColumn itemRenderer="{getRenderer()}" dataField="startDate"/>
</mx:columns>
</mx:DataGrid>
waar mijn dataProvider mainModel.posts een ArrayCollection is met Objecten waarin een attribuut startDate zit
Pilekes
%Europe/Berlin %690 %2009, 16:34
Hmmm hij doet nu iets, maar hij werkt nog niet goed...
bijv. Als ik er overheen tab na iets geselecteerd te hebben, maakt hij um leeg...
De waarde die hij erin zet ziet eruit als Thu Dec 31 00:.... Totdat ik hem aanklik, dan maakt hij er netjes 31-12-2009 van...
Sjoedzj
%Europe/Berlin %711 %2009, 17:03
Bij mij werkt het prima, post anders je code eens...
Pilekes
%Europe/Berlin %374 %2009, 08:58
Ok :)
Heb het maar even in een bijlage gestopt...
Zo krijg ik o.a. ook de melding als ik een datum veld ge-edit heb, eruit tab en er weer terug in tab een melding met 'Type Coercion failed: cannot convert "31-12-2009" to Date.'
Sjoedzj
%Europe/Berlin %401 %2009, 09:38
je gebruikt itemEditor ipv itemRenderer..;)
Pilekes
%Europe/Berlin %414 %2009, 09:56
Klopt, maar dat is ook gewenst, gezien anders altijd dat veld zo te zien is...
Maar ook al zet ik hem op itemRenderer, krijg ik even hard foutmeldingen...
Sjoedzj
%Europe/Berlin %430 %2009, 10:19
Dit zou moeten werken:
<mx:Script>
<![CDATA[
public function getRenderer():IFactory{
var factory:ClassFactory = new ClassFactory(DateField);
factory.properties = {formatString: 'DD-MM-YYYY'};
return factory;
}
public function labelFunc(d:Post, o:Object):String{
return formatter.format(d.date);
}
]]>
</mx:Script>
<mx:DataGrid dataProvider="{mainModel.posts}" editable="true">
<mx:columns>
<mx:DataGridColumn itemEditor="{getRenderer()}" editorDataField="selectedDate" dataField="date" labelFunction="labelFunc"/>
</mx:columns>
</mx:DataGrid>
Oh, en Post is bij mij de Klasse waar het attribute 'date' in zit.
Pilekes
%Europe/Berlin %453 %2009, 10:53
Ik voel me echt zo'n prutser op het moment...
Maar ik krijg de volgende foutmelding:
1046: Type niet gevonden of geen constante bij compilatie. Post.
Sjoedzj
%Europe/Berlin %457 %2009, 10:59
Post is het object dat ik gebruik waar mijn datum in zit.
de ArrayList die ik mee geef aan de dataProvider bevat een aantal Post objecten.
je kunt :
public function labelFunc(d:Post, o:Object):String{
return formatter.format(d.date);
}
vervangen door:
public function labelFunc(d:Object, o:Object):String{
return formatter.format(d.to_dateend);
}
Pilekes
%Europe/Berlin %657 %2009, 15:47
Ok geweldig nu werkt het dus wel na wat gepiel :P
Enkel is het nu erg moeilijk om het zo te maken dat je in het veld mag typen?
Sjoedzj
%Europe/Berlin %671 %2009, 16:07
nee, dan moet je in dit stukje code die propertie erbij zetten:
factory.properties = {formatString: 'DD-MM-YYYY', editable: true};
Pilekes
%Europe/Berlin %356 %2009, 08:33
Geweldig :)
Enkel krijg ik dan het volgende probleem...
Op het moment dat ik in het veld klik en ik ga er weer uit dat het veld leeg gemaakt wordt... Het rare is ook als ik er dan weer in terug tab dat hij de datum die ervoor stond weergeeft in een foutmelding dat deze niet geconverteerd kan worden naar een datum?
TypeError: Error #1034: Type Coercion failed: cannot convert "18-12-2008" to Date.
[edit]
Nevermind, ik had tijdens het klooien om het veld editable te maken
editorDataField="selectedDate"
weggehaald en dan werkt het dus niet...
Nu wel!
Thanks! ;)
Sjoedzj
%Europe/Berlin %646 %2009, 15:30
Fijn dat het gelukt is, ik was zelf ook al weer aan het stoeien om jou error te reproduceren:)
reyntjensw
%Europe/Berlin %723 %2009, 17:21
Voor die formatter.format, welke import moet je daarvoor doen?
Ik probeerde import mx.formatters.*; maar zonder resultaat
Sjoedzj
%Europe/Berlin %386 %2009, 09:16
Je moet die formatter natuurlijk wel eerst aanmaken.
<mx:DateFormatter id="formatter" formatString="DD-MM-YYYY"/>
reyntjensw
%Europe/Berlin %413 %2009, 09:55
Ik had vergeten mijn dateformatter een id te geven.
Bedankt, het werkt perfect:)
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.