TextBox中输入某一日期,如何在Calendar控件中显示出TextBox中指定的日期,现在好像只能显示到当月的日期

解决方案 »

  1.   

    且不管你的textbox和calendar是如何布局的(通常可以在一个table中一行是text,另一行是一个calendar,并且后者的样式中设置position:absolute),假设我们把它们的数据模型在组件(aspx或者ascx或者masterpage等等)的接口中表示出来,那么其设计逻辑基本上是这样的关系:protected void Page_Load(object sender, EventArgs e)
    {
        this.Calendar1.SelectionChanged += (s, arg) => { this.日期 = this.Calendar1.SelectedDate; };
        this.TextBox1.TextChanged += (s, arg) =>
        {
            DateTime d;
            if (DateTime.TryParse(this.TextBox1.Text, out d))
                this.日期 = d;
        };
    }public DateTime? 日期
    {
        get
        {
            var x = this.ViewState["theDate"];
            if (x != null)
                return ((DateTime)x).Date;
            else
                return null;
        }
        set
        {
            if (!value.HasValue && !this.日期.HasValue)
                return;        if (value.HasValue && this.日期.HasValue && value.Value != this.日期.Value)
            {
                this.ViewState["theDate"] = value.Value;
                this.Calendar1.SelectedDate = value.Value;
                this.TextBox1.Text = value.Value.ToString("yy年M月d日");
            }
        }
    }
      

  2.   

    解释一下上面:在组件(不管你是aspx还是ascx或者别的组件)的开发api接口上定义“日期”属性,它的类型是“日期?”,组件可以通过ViewState保存其值。然后让组件的内部表现层——TextBox和Calendar两个控件分别和这个属性双向绑定,当设置组件的这个属性时就会设置这两个控件的表现内容,当控件被用户操作时就会设置组件的属性值。以上就是它设计。当然,好的组件本身通常还会继承 INotifyPropertyChanged 接口让属性改变的事件可以被组件的客户程序捕捉到,这就属于你问题问题之外的,但是其实需要在属性的set方法中多写一行代码,只是在这里随便提一下。
      

  3.   

    嗯,哈哈,上面的属性的set虽然意思有了,可是逻辑写错了,大致应该改为:    public DateTime? 日期
        {
            get
            {
                var x = this.ViewState["theDate"];
                if (x != null)
                    return ((DateTime)x).Date;
                else
                    return null;
            }
            set
            {
                if (!value.HasValue && !this.日期.HasValue)
                    return;            if (value.HasValue && this.日期.HasValue && value.Value == this.日期.Value)
                    return;            this.ViewState["theDate"] = value.Value;
                this.Calendar1.SelectedDate = value.Value;
                this.TextBox1.Text = value.Value.ToString("yy年M月d日");
            }
        }
      

  4.   

    我是直接写成Calendar1.SelectedDate = DateTime.ParseExact(TextBox1.Text, "yyyy.MM.dd", System.Globalization.CultureInfo.CurrentCulture)
    这句对当月日期有效,其他月份的日期Calendar控件不切换到那个月
      

  5.   

    其实上面我的demo代码中属性的set方法还是有bug,当value为null时其实应该清除ViewState中的内容并正确设置这两个控件表现内容为某个默认“空值”状态。不过我的demo程序不是为了实际去做项目(因此不再去修改代码了),是为了说明一个数据模型值跟两个表现层控件相关联成为三角关系时的软件设计。实际上客户端软件往往是一个数据模型值跟许多表现层控件相关联,远远不仅两个。这些控件之间不需要相关,因此mvc将控件之间的关系解耦的功能体现出来,表现层都跟数据模型双向绑定,就能让控件间接地相互协调。就是这样设计复杂的业务界面的。
      

  6.   


    其实我觉得初学者的写法反而“很高深”(既很乱很乱地),而使用mvc方式来设计界面操作架构则是比较傻瓜化地。不是吗?
      

  7.   

    哦我说的mvc是真正的架构设计模式,而不是什么asp.net mvc。后者是什么烂产品,跟我要说的如何为多个控件之间的关系解耦无关啊。