2011-02-03 6 views
0

DateTimeControlのカスタムイベントが発生していません。代わりにCreateChildControls()が起動しているので、毎回カレンダーの日付を変更します。DateTimeControlカスタムOnDateChangeイベントがSharePointで発生しない

namespace myn 
{ 
    class StopTimeFieldControl : BaseFieldControl 
    { 
    protected DateTimeControl dateTime; 

    public override object Value 
    { 
     get 
     { 
      EnsureChildControls(); 
      if (dateTime == null) 
      { 
       return string.Empty; 
      } 
      return dateTime.SelectedDate; 
     } 
     set 
     { 
      EnsureChildControls(); 
      dateTime.SelectedDate = Convert.ToDateTime(this.ItemFieldValue); 
     } 
    } 

    protected override string DefaultTemplateName 
    { 
     get 
     { 
      return "StopTimeFieldControl"; 
     } 
    } 

    public override void Validate() 
    { 
     if (ControlMode == SPControlMode.Display || !IsValid) 
     { 
      //this.ViewState["StopTimeFieldControl"] = Value.ToString(); 
      return; 
     } 
     base.Validate(); 
     if (dateTime.IsDateEmpty) 
     { 
      this.ErrorMessage = " Du måste ange ett värde för det här obligatoriska fältet."; 
      IsValid = false; 
      return; 
     } 
     try 
     { 
      StartTimeFieldControl child = (StartTimeFieldControl)FindControlRecursive(this.Page, "startDateTime").Parent; 
      if (dateTime.SelectedDate < Convert.ToDateTime(child.Value)) 
      { 
       this.ErrorMessage = " Du måste ange ett värde som är senare än startdatum."; 
       IsValid = false; 
       return; 
      } 
     } 
     catch (Exception e) 
     { 
      PortalLog.LogString("## Exception Occurred: Fail when trying to catch startDateTime ** {0} || {1}", e.Message, e.StackTrace); 
     } 
     this.Page.Session["startDateTime"] = Value; 
    } 

    protected override void CreateChildControls() 
    { 
     if (Field == null) return; 
     base.CreateChildControls(); 
     if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display) 
      return; 
     if (ControlMode == SPControlMode.New || ControlMode == SPControlMode.Edit) 
     { 
      dateTime = new DateTimeControl(); 
      dateTime.CssClassTextBox = "ms-long"; 
      dateTime.TimeZoneID = 1053; 
      dateTime.LocaleId = 1053; 
      dateTime.ID = "stopDateTime"; 
      dateTime.AutoPostBack = true; 
      this.dateTime.DateChanged += new EventHandler(dateTime_DateChanged); 
      Controls.Add(dateTime); 
     } 
     //ChildControlsCreated = true; 
    } 

    void dateTime_DateChanged(object sender, EventArgs e) 
    { 

     string hi = "hej"; 

    } 

    public static Control FindControlRecursive(Control Root, string Id) 
    { 
     if (Root.ID == Id) 
      return Root; 
     foreach (Control Ctl in Root.Controls) 
     { 
      Control FoundCtl = FindControlRecursive(Ctl, Id); 
      if (FoundCtl != null) 
       return FoundCtl; 
     } 
     return null; 
    } 

} 

}

答えて

0

CreateChildControlsの中であなたのDateTimeControlのPREINITでコントロールまたは初期化フェーズを作成しないようにしてください。このような動作の原因としては、ページライフサイクルがポストバックイベント処理を通過したときに制御が遅すぎることがあります。

0

CreateChildControlsの()私は カレンダー

に日付を変更しかし、すべての時間を拘束されているイベントハンドラです 、すべての-時間焼成されますか?

ほとんどの場合、私はifステートメントでコントロールを作成しません。物事は正しく配線されない傾向があります。

代わりにコントロールを非表示にしてみてください。

dateTime = new DateTimeControl(); 
if (ControlMode == SPControlMode.New || ControlMode == SPControlMode.Edit) 
{ 
    datetime.Visible = false; 
+0

Evenハンドラは一度バインドされ、Dateが選択されたときに呼び出される必要がありますか? –

+0

イベントハンドラは実際にはすべてのリクエストにバインドされるべきです – djeeg

+0

しかし、なぜ私は日付を変更するたびにCreateChildControls()が呼び出されていますか? –

関連する問題