2009-06-11 14 views
6

Ho una casella di testo mascherata associata a un valore di data/ora nulla, ma quando la data viene cancellata, la convalida sulla casella di testo mascherata non verrà completata. C'è un modo per forzare questo comportamento? Voglio una casella di testo cancellata per uguagliare un DateTime nullo.Impossibile associare DateTime a MaskedTextBox

Quando la casella di testo è già nullo, la convalida funziona. Si rompe solo quando c'è una data già vincolata e cerco di cancellarla.

risposta

4

ho capito che non aveva a che fare con la convalida. Era quando la data veniva analizzata di nuovo sul datetime.

Questo potrebbe non essere il modo più elegante per farlo, ma funziona. Se qualcuno conosce un modo migliore, per favore fatemelo sapere.

Ho questo codice ora.

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

Questo dovrebbe funzionare:

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

Questo sembra aver peggiorato la situazione. Ora non verrà convalidato anche se nella casella di testo era già presente un valore nullo. Prima che funzionasse bene se fosse iniziato come null, non funziona solo quando c'è una data che viene cancellata. –

0

Sperimentando con questo ho finalmente trovato una soluzione più facile a questo.

FASE 1:

Cerca la linea che vincola il vostro MaskedTextBox (il mio chiama "mTFecha") nelle Form.Designer.cs. cioè:

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

FASE 2:

Applicare un hack minore:

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

gioco è fatto!

1

Io uso questo con maskedtextbox per datetime tipo

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

se necessario null valore di data, utilizzare nullable tipo datetime nella dichiarazione di classe:

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

Si può semplicemente dare formato della data, come di seguito:

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