2011-02-03 34 views
0

DateTimeControl的自定義事件未觸發。相反,CreateChildControls()會觸發,每次更改日曆上的日期。DateTimeControl在SharePoint中未觸發的自定義OnDateChange事件

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

嘗試創建PreInit或初始化階段,而不是在你的CreateChildControls控制DateTimeControl。這種行爲的可能原因 - 當頁面生命週期通過回發事件處理時,您的控件創建得太晚。

0

的CreateChildControls()被解僱, 的每次更改的日期 日曆

但在事件處理程序的限制,每次?

在大多數情況下,我不會在if語句中創建控件,但事情往往無法正確連接。

試着讓控件不可見。

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

即使處理程序應該綁定一次,並在選擇日期時調用,不是嗎? – 2011-02-03 22:39:11

相關問題