I have a masked text box bound to a nullabe datetime, but when the date is blanked out, the validation on the masked text box won\'t complete. Is there a way to force this
I use this with maskedtextbox
for datetime
type
this.txtDateBrth.DataBindings.Add("Text", bsAgent, "DateBrth", true, DataSourceUpdateMode.OnPropertyChanged, null, "dd/MM/yyyy");
if need null
date value, use nullable datetime type in class declaration :
private DateTime? _DateBrth;
public DateTime? DateBrth
{
get { return _DateBrth; }
set { _DateBrth = value; }
}
This should work:
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;
}
I figured out it didn't have to do with the validation. It was when the date was being parsed back to the datetime.
This may not be the most elegant way to do this, but it does work. If anyone knows a better way, please let me know.
I have this code now.
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;
}
Experimenting with this i finally found an easier solution to this.
STEP 1:
Search the line that is binding your maskedtextbox (mine's called "mTFecha") in your Form.Designer.cs. i.e:
// mTFecha
//
this.mTFecha.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.listaAnimalesOfertadosBindingSource, "F_peso", true);
STEP 2:
Apply a minor hack:
this.mTFecha.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.listaAnimalesOfertadosBindingSource, "F_peso", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, " / /"));
You're Done!
You can simply give date format as below:
maskTextBox1.DataBindings.Add("Text", bs, "SummitDate1", true, DataSourceUpdateMode.OnPropertyChanged, null, "dd/MM/yyyy");