2009-06-11 6 views
6

J'ai une zone de texte masquée liée à un datetime nullabe, mais lorsque la date est masquée, la validation sur la zone de texte masquée ne se terminera pas. Y a-t-il un moyen de forcer ce comportement? Je veux une zone de texte masquée pour égaler un DateTime null.Bind nullable DateTime à MaskedTextBox

Lorsque la zone de texte est déjà null, la validation fonctionne. Il ne casse que lorsqu'il y a une date déjà liée et j'essaie de l'effacer.

Répondre

4

j'ai compris qu'il n'a pas eu à faire avec la validation. C'était quand la date était réexaminée au datetime.

Ce n'est peut-être pas la façon la plus élégante de le faire, mais cela fonctionne. Si quelqu'un connaît un meilleur moyen, s'il vous plaît faites le moi savoir.

J'ai ce code maintenant.

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

Cela devrait fonctionner:

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

Cela semble avoir aggravé la situation. Maintenant, il ne sera pas validé même s'il y avait déjà un NULL dans la zone de texte. Avant que cela fonctionne bien si elle a commencé comme nulle, cela ne fonctionne pas quand il y a une date qui est masquée. –

0

Expérimenter avec ceci, j'ai finalement trouvé une solution plus facile à cela.

ÉTAPE 1:

Rechercher la ligne qui lie votre MaskedTextBox (le mien est appelé "mTFecha") dans votre Form.Designer.cs. i.e.:

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

ÉTAPE 2:

Appliquer un hack mineur:

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

Vous avez terminé!

1

J'utiliser avec maskedtextbox pour datetime Type

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

si la valeur de la date besoin null, utilisez le type datetime annulable dans la déclaration de classe:

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

Vous pouvez simplement donner le format de date comme ci-dessous:

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