2009-06-11 3 views
6

У меня есть замаскированное текстовое поле, связанное с датой nullabe, но когда дата не заполнена, проверка в скрытом текстовом поле не будет завершена. Есть ли способ заставить это поведение? Я хочу, чтобы пустое текстовое поле равнялось null DateTime.Bind nullable DateTime to MaskedTextBox

Когда текстовое поле уже имеет значение null, валидация работает. Он только ломается, когда есть дата, уже связанная, и я пытаюсь ее исключить.

ответ

4

я понял, что не нужно делать с проверкой. Это было, когда дата была проанализирована обратно в datetime.

Это может быть не самый элегантный способ сделать это, но он действительно работает. Если кто-нибудь знает лучший способ, пожалуйста, дайте мне знать.

У меня есть этот код сейчас.

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

Это должно работать:

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; 

} 
+0

Это похоже на ухудшение. Теперь он не будет проверяться, даже если в текстовом поле уже есть нуль. Прежде чем он будет работать нормально, если он начнется с нулевого значения, он не будет работать, когда будет погашена дата. –

0

Экспериментируя с этим, я, наконец, нашел более легкое решение.

ШАГ 1:

Поиск строки, которая является обязательной для вашего MaskedTextBox (мой называются "mTFecha") в вашем Form.Designer.cs. то есть:

// 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, "//")); 

Вы сделали!

1

Я использую это с maskedtextbox для datetime типа

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

при необходимости null значения даты, используйте обнуляемый тип DATETIME в объявлении класса:

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

Вы можете просто дать формат дата, как показано ниже:

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