【问题标题】:Bind nullable DateTime to MaskedTextBox将可为空的 DateTime 绑定到 MaskedTextBox
【发布时间】:2017-07-07 14:06:09
【问题描述】:

我有一个绑定到 nullabe 日期时间的蒙面文本框,但是当日期空白时,蒙面文本框的验证将无法完成。有没有办法强制这种行为?我想要一个空白的文本框等于一个空的 DateTime。

当文本框已经为空时,验证工作。只有当日期已经绑定并且我尝试将其清除时才会中断。

【问题讨论】:

    标签: c# data-binding datetime nullable maskedtextbox


    【解决方案1】:

    我发现它与验证无关。那是日期被解析回日期时间的时候。

    这可能不是最优雅的方法,但它确实有效。如果有人知道更好的方法,请告诉我。

    我现在有这个代码。

    public static void FormatDate(MaskedTextBox c) {
        c.DataBindings[0].Format += new ConvertEventHandler(Date_Format);
        c.DataBindings[0].Parse += new ConvertEventHandler(Date_Parse);
    }
    
    private static void Date_Format(object sender, ConvertEventArgs e) {
        if (e.Value == null)
            e.Value = "";
        else
            e.Value = ((DateTime)e.Value).ToString("MM/dd/yyyy");
    }
    
    static void Date_Parse(object sender, ConvertEventArgs e) {
        if (e.Value.ToString() == "  /  /")
            e.Value = null;
    }
    

    【讨论】:

      【解决方案2】:

      我将此与maskedtextbox 一起用于datetime 类型

      this.txtDateBrth.DataBindings.Add("Text", bsAgent, "DateBrth", true, DataSourceUpdateMode.OnPropertyChanged, null, "dd/MM/yyyy");
      

      如果需要null 日期值,请在类声明中使用可为空的日期时间类型:

      private DateTime? _DateBrth;
              public DateTime? DateBrth
              {
                  get { return _DateBrth; }
                  set { _DateBrth = value; }
              }
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        private void Form1_Load(object sender, EventArgs e)
        {
            maskedTextBox1.Mask = "00/00/0000";
            maskedTextBox1.ValidatingType = typeof(System.DateTime);
            maskedTextBox1.TypeValidationCompleted += new TypeValidationEventHandler
               (maskedTextBox1_TypeValidationCompleted);
        }
        
        
        
        private void TypeValidationCompletedHandler(object sender, TypeValidationEventArgs e )
        {
            e.Cancel = !e.IsValidInput &&
                this.maskedTextBox1.MaskedTextProvider.AssignedEditPositionCount == 0;
        
        }
        

        【讨论】:

        • 这似乎让情况变得更糟了。现在,即使文本框中已经有 null,它也不会验证。如果它以 null 开头就可以正常工作,但只有在有一个日期被空白时它才不起作用。
        【解决方案4】:

        尝试了这个,我终于找到了一个更简单的解决方案。

        第 1 步:

        在 Form.Designer.cs 中搜索绑定掩码文本框(我的称为“mTFecha”)的行。即:

         // mTFecha
         // 
         this.mTFecha.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.listaAnimalesOfertadosBindingSource, "F_peso", true);
        

        第 2 步:

        应用一个小技巧:

        this.mTFecha.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.listaAnimalesOfertadosBindingSource, "F_peso", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, "  /  /"));
        

        你已经完成了!

        【讨论】:

          【解决方案5】:

          您可以简单地给出如下日期格式:

          maskTextBox1.DataBindings.Add("Text", bs, "SummitDate1", true, DataSourceUpdateMode.OnPropertyChanged, null, "dd/MM/yyyy");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-02
            • 1970-01-01
            • 1970-01-01
            • 2012-07-11
            • 2013-06-24
            • 2012-03-21
            • 2021-11-01
            • 2018-05-17
            相关资源
            最近更新 更多