DateTimeControl自定义OnDateChange事件未在SharePoint中触发

时间:2011-02-03 15:43:57

标签: asp.net sharepoint

DateTimeControl的自定义事件未触发。相反,CreateChildControls()每次都在日历上更改日期时触发。

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;
    }

}

}

2 个答案:

答案 0 :(得分:0)

尝试在PreInit或Init阶段创建DateTimeControl控件,而不是在CreateChildControls中创建。这种行为的可能原因 - 当页面生命周期通过回发事件处理时,您的控件创建得太晚。

答案 1 :(得分:0)

  

CreateChildControls()正在触发,   每次我改变日期   日历

但每次都绑定事件处理程序吗?

在大多数情况下,我不会在if语句中创建控件,事情往往无法正确连接。

尝试让控件不可见。

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