shm*_*dor 16 c# datetimepicker winforms
Binding b = new Binding( "Value", person, "BdayNullable", true );
dtBirthdayNullable.DataBindings.Add( b );
b.Format += new ConvertEventHandler( dtBirthdayNullable_Format );
b.Parse += new ConvertEventHandler( dtBirthdayNullable_Parse );
void dtBirthdayNullable_Format( object sender, ConvertEventArgs e )
{
// e.Value is the object value, we format it to be what we want to show up in the control
Binding b = sender as Binding;
if ( b != null )
{
DateTimePicker dtp = (b.Control as DateTimePicker);
if ( dtp != null )
{
if ( e.Value == DBvalue.value )
{
dtp.ShowCheckBox = true;
dtp.Checked = false;
// have to set e.Value to SOMETHING, since it's coming in as NULL
// if i set to DateTime.Today, and that's DIFFERENT than the control's current
// value, then it triggers a CHANGE to the value, which CHECKS the box (not ok)
// the trick - set e.Value to whatever value the control currently has.
// This does NOT cause a CHANGE, and the checkbox stays OFF.
e.Value = dtp.Value;
}
else
{
dtp.ShowCheckBox = true;
dtp.Checked = true;
// leave e.Value unchanged - it's not null, so the DTP is fine with it.
}
}
}
}
void dtBirthdayNullable_Parse( object sender, ConvertEventArgs e )
{
// e.value is the formatted value coming from the control.
// we change it to be the value we want to stuff in the object.
Binding b = sender as Binding;
if ( b != null )
{
DateTimePicker dtp = (b.Control as DateTimePicker);
if ( dtp != null )
{
if ( dtp.Checked == false )
{
dtp.ShowCheckBox = true;
dtp.Checked = false;
e.Value = DBvalue.Value
}
else
{
DateTime val = Convert.ToDateTime( e.Value );
e.Value =val;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个很好的解决方案
http://blogs.interknowlogy.com/danhanan/archive/2007/01/21/10847.aspx
另一个完美的解决方案
http://www.mofeel.net/70-microsoft-public-dotnet-framework-windowsforms/8806.aspx
Han*_*son 23
DateTimePicker
s不能设置为null,因为DateTime
不能为null,但您可以将它们DateTime.MinValue
设置为未初始化的默认值DateTime
.然后你只是检查是否dtp.Value = DateTime.MinValue
,如果是,将其视为null.
但是,如果您想真正区分何时没有选择任何值,最简单的方法是设置DateTimePicker.ShowCheckBox
为true,然后检查dtp.Checked
是否为真,您将读取该值,否则将其视为null.
小智 14
您可以检查绑定源是否提供"空日期"或您不想显示的日期值.
如果是,请选择自定义格式:
yourDTP.Format = DateTimePickerFormat.Custom
yourDTP.CustomFormat = " "
Run Code Online (Sandbox Code Playgroud)
添加"CloseUp"或"ValueChanged"事件处理程序以重置用户操作的格式:
yourDTP.Format = DateTimePickerFormat.Short
Run Code Online (Sandbox Code Playgroud)