2014-01-16 1 views
1
<code> 
<?xml version="1.0" encoding="utf-8"?> 
<s:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      creationComplete="init()"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Script> 

      <![CDATA[ 
       import com.amdocs.infra.utils.FlexFormatters; 

       import mx.collections.ArrayCollection; 
       import mx.controls.DateField; 
       import mx.events.CalendarLayoutChangeEvent; 
       import mx.events.FlexEvent; 
       import mx.formatters.DateFormatter; 
       import mx.utils.StringUtil; 

       import spark.events.IndexChangeEvent; 
       private var arr:ArrayCollection = new ArrayCollection(); 
       private var date:Date; 
       private var selecteDate:Date = new Date(); 
       public var dateChanged :Boolean; 
       [Bindable] 
       private var timezone:String; 


       [Bindable] 
       public function get selectedDate():Date 
       { 
        if(dateChanged) 
        return date; 
        else 
         return selecteDate; 
       } 

       public function set selectedDate(value:Date):void 
       { 
        if(value.toString()!= null) 
        { 
        selecteDate = value; 
        var dateformatter:DateFormatter = new DateFormatter(); 
        dateformatter.formatString = "MM/DD/YYYY L:NN:SSA"; 
        var dateStr:String = dateformatter.format(value).substr(0,10); 
        var dateArray:Array = dateStr.split("/"); 
        dateInput.selectedDate = new Date(dateArray[2],dateArray[0]-1,dateArray[1]); 
        timeInput.selectedItem = dateformatter.format(value).substr(11,10); 
        dateStringLabel.text = FlexFormatters.getDateTimeFormatter({ dateTimePattern: "EEEE, MMMM dd, yyyy h:mm:ss a" }).format(value); 
        dateChanged = false;  
        timezone = TimeZoneUtil.getTimeZone(); 

        } 
       } 

      protected function formatTime():void 
      { 
      var rawTimeString:String; 
      // If the combobox has a custom value, hten use the selectedItem. Otherwise, use the selectedItem.value 
      if (timeInput.selectedIndex == ComboBox.CUSTOM_SELECTED_ITEM) 
      rawTimeString = StringUtil.trim(timeInput.selectedItem).toUpperCase(); 
      else if (timeInput.selectedIndex != -1) 
      rawTimeString = StringUtil.trim(timeInput.selectedItem).toUpperCase(); 

      // look for AM or PM at end of the timestring 
      var amPm:String = ""; 
      if (rawTimeString.substr(-2) == "AM") 
      amPm = "AM"; 
      else if (rawTimeString.substr(-2) == "PM") 
      amPm = "PM"; 

      // Split time by colons 
      var timeArr:Array = StringUtil.trimArrayElements(rawTimeString.replace(amPm, ""),":").split(":"); 
      var hour:int = 0; 
      var minute:int = 0; 
      var second:int = 0; 

      // determine the hour/minute/second from the array 
      if (timeArr.length >= 2) 
      { 
       hour = timeArr[0]; 
       minute = timeArr[1]; 
       second = (timeArr.length == 3 ? timeArr[2] : 0) ; 
      } 
      else 
      { 
      trace("Error parsing time (" + rawTimeString + "). Defaulting to midnight"); 
      } 

      // If it is an AM time and hour is 12 (midnight) then set the hour to zero) 
      if (amPm == "AM" && hour == 12) 
       hour = 0; 
      // add 12 hours if the hour is between 1 and 11 
      else if (amPm == "PM" && hour >=1 && hour <= 11) 
       hour = hour + 12; 

      // If hours, minutes, or seconds exceed what they should be, then 
      // calculate how many days/hours/minutes should be added to the final date 
      // and determine the final hour/minute/second 
      if (second >= 60) 
      { 
       minute += Math.floor(second/60); 
       second = second % 60; 
      } 
      if (minute >= 60) 
      { 
       hour += Math.floor(minute/60); 
       minute = minute % 60; 
      } 
      var addedDays:int = 0; 
      if (hour >= 24) 
      { 
       addedDays += Math.floor(hour/24); 
       hour = hour % 24; 
      }     
      var timeString:String = lpad(hour,2,"0") + ":" + lpad(minute,2,"0") + ":" + lpad(second,2,"0"); 
      var dateString:String = FlexFormatters.getDateTimeFormatter({ "dateTimePattern": "yyyy-MM-dd" }).format(dateInput.selectedDate); 

      // Create date from final dateString/timeString 
      date = DateFormatter.parseDateString(dateString + " " + timeString); 

      // Add days to the final date if needed 
      if (date != null && addedDays > 0) 
      date.setDate(date.getDate() + addedDays); 

      //dateValueLabel.text = (date != null?date.toString():null); 
      dateStringLabel.text = FlexFormatters.getDateTimeFormatter({ dateTimePattern: "EEEE, MMMM dd, yyyy h:mm:ss a" }).format(date); 
      dateChanged = true; 
      } 

      // helper function to add a leading zero to hour/minute/second 
      private function lpad(number:int, width:int, padChar:String = " "):String 
      { 
       var ret:String = ""+number; 
       while(ret.length < width) 
       ret=padChar + ret; 
       return ret; 
      } 
      private function init():void 
      { 
      for each (var ampm : String in ["AM","PM"]) 
       { 
       for(var i :int = 0;i<12;i++) 
       { 
        var hours:int = (i == 0?12:i); 
        for each(var minutes : String in ["00","30"]) 
          { 
           var item:Object = hours+":"+minutes+" "+ampm; 
           arr.addItem(item); 


           //trace(hours+":"+minutes+" "+ampm); 
          } 
         } 
        }     
        timeInput.dataProvider = arr; 

       }  

       protected function timeInput_changeHandler(event:IndexChangeEvent):void 
       { 
        if (timeInput.selectedIndex!= ComboBox.CUSTOM_SELECTED_ITEM) 
        { 

         timeInput.selectedItem = String(timeInput.selectedItem).replace(" ",":00"); 
        } 
        // TODO Auto-generated method stub 
        if(dateInput.selectedDate!= null) 

         formatTime(); 



       } 

       protected function dateInput_changeHandler(event:CalendarLayoutChangeEvent):void 
       { 
        // TODO Auto-generated method stub 
        if(timeInput.selectedItem!= null) 
        formatTime(); 
      } 


      ]]> 
    </fx:Script> 

    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
<s:VGroup> 
     <s:HGroup> 
      <mx:DateField id="dateInput" change="dateInput_changeHandler(event)"/> 
      <s:ComboBox id="timeInput" labelField="value" initialize="timeInput_initializeHandler(event)" click="timeInput_clickHandler(event)" change="timeInput_changeHandler(event)"/> 
      <s:Label text="{timezone}" paddingTop="8"/> 
     </s:HGroup> 
    <s:Label id="dateStringLabel"/> 
</s:VGroup> 
</s:HGroup> 
</code> 

위의 코드는 (HH : MM : SSAM/PM) 형식으로 날짜와 시간을 선택할 수있는 날짜 시간 선택기입니다.combox의 커서를 특정 인덱스로 설정하는 방법은 무엇입니까?

사용자가 Grid를 두 번 클릭하면이 날짜 시간 선택기가 호출됩니다. 격자에는 선택한 날짜라는 열이 있습니다. 손해에서 가져 오는 값은 날짜 및 시간 differenlty로 분리되어 datefield 및 time에 할당됩니다. combox에.

클라이언트는 다음과 같은 방법으로 작업을 combox 싶어 :

선택한 날짜 필드가 12/12/12 오전 4시 20분 15초하고있는 경우 가정 드롭 다운에 사용자가 클릭 한 다음 (12)에서 시작해서는 안 드롭 다운 경우 : 오전 4시 20 분 15시와 같이 앞으로 다가올 시간부터 시작해야합니다. 오전 4시 30 분부터 오전 7시 50 분 12 초까지 시작해야합니다. 오전 8 시부 터 시작해야합니다. Please Advice

답변

0

timeInput.dataProvider에 데이터가 있으므로 깨끗한 해결책은이 dataProvider에서 원하는 항목을 찾고 ("4:30"으로 값 지정) 선택한 다음 selectedItem으로 설정하는 것입니다. 또는 selectedIndex에 대한 인덱스), 이것은 dro를 만듭니다. pdown가 열릴 때이 항목으로 스크롤됩니다.

이벤트에 대한 드롭 다운을 수동으로 (프로그래밍 방식으로) 스크롤 할 수는 있지만 작업이 조금 더 많을 수도 있으며 사용자 정의 콤보 박스를 만들어야 할 수도 있습니다.하지만 필자는이 " 덜 깨끗한 "솔루션입니다 ...

+0

아니, 문제는 combox 값이 4:20:15 AM으로 표시되어야하지만 사용자가 combox에서 원하는 값을 선택하려면 4:30부터 시작해야합니다. . 값이 9:45 PM이면 오후 10 시부 터 시작해야합니다. – user1942215

+0

나는 약간의 논리를 작성했지만 가장 먼저 할 일은 프로 그램에서 술집을 어떻게 스크롤 할 수 있는지 그리고 어떤 이벤트가 나는지를 볼 수 있는지를 확인했습니다. 그것의 작동하지 않는 변경 – user1942215

+0

list 구성 요소에서 list.scrollToIndex() 메서드가 있었지만 mx : L에서 확실히 나타났습니다. ist, spark version s : List에 있다면 확실하지 않습니다. 아직도, 이것은 "수동으로"할 수 있습니다, 나는 콤보 박스를 덮어 쓰고 거기에 자신의 기능을 만듭니다. 죄송합니다. 지금 당장 직접 코드를 시도하고 정확한 단계를 말할 수는 없습니다 ... – user3190916

관련 문제