2009-06-11 9 views
6

Mam zamaskowane pole tekstowe powiązane z datulaną nullabe, ale gdy data jest pusta, sprawdzanie poprawności w zamaskowanym polu tekstowym nie zostanie zakończone. Czy istnieje sposób na wymuszenie tego zachowania? Chcę, aby puste pole tekstowe miało wartość równą zerowemu DateTime.Powiąż Nullable DateTime z MaskedTextBox

Gdy pole tekstowe ma już wartość zerową, sprawdzanie poprawności działa. Przerywa się tylko wtedy, gdy data jest już ograniczona i próbuję ją wyzerować.

Odpowiedz

4

zorientowali się, że nie ma do czynienia z walidacji. To było, gdy data była przetwarzana z powrotem do datetime.

To może nie być najbardziej elegancki sposób na zrobienie tego, ale działa. Jeśli ktoś zna lepszy sposób, proszę dać mi znać.

Mam ten kod teraz.

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

To powinno działać:

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

To chyba pogorszyło sprawę. Teraz nie będzie sprawdzania poprawności, nawet jeśli w polu tekstowym jest już wartość zerowa. Zanim będzie działać poprawnie, jeśli zaczyna się od wartości null, to nie działa tylko wtedy, gdy data jest wygaszona. –

0

Eksperymentowanie z tym w końcu znalazłem łatwiejsze rozwiązanie tego.

KROK 1:

Szukaj wiersz, który jest wiążący swoją maskedtextbox (kopalnia nazywa "mTFecha") w swoim Form.Designer.cs. tj:

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

KROK 2:

Nałożyć niewielką Hack:

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

skończysz!

1

Używam tego z maskedtextbox dla datetime typu

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

jeśli potrzeba null wartość daty, używać zerowalne typu datetime w deklaracji klasy:

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

można po prostu podać datę w formacie jak poniżej:

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