在C#中的DateTimePicker中设置Null值

本文关键字:设置 Null DateTimePicker 中的 | 更新日期: 2023-09-27 17:57:59

我正在C#中开发一个基于winform的Desktop应用程序。我希望用户将DateTimePicker设置为Null。我正在开发一个搜索框,如果将其设置为Null ,则希望忽略该日期

以下是我正在做的事情:

     this.dateTimePicker2.CustomFormat = " ";
     this.dateTimePicker2.Format = DateTimePickerFormat.Custom;
     private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
     {
         this.dateTimePicker2.CustomFormat = "dd-MM-yy";
     }

到目前为止还不错。但是,一旦用户选择了日期,dateTimePicker2控件就会显示某个日期(用户已选择的日期)。没有办法再次将日期设置为空。我不想启用与datetimepicker控件关联的复选框。

我想知道是否可以将datetimepicker日期设置为null

感谢

在C#中的DateTimePicker中设置Null值

这是一篇旧帖子的参考,但该网站上的其他用户已经在这里发布了它

// Use ValueChanged to decide if the value should be displayed:
    dateTimePicker1.ValueChanged += (s, e) => { dateTimePicker1.CustomFormat = (dateTimePicker1.Checked && dateTimePicker1.Value != dateTimePicker1.MinDate) ? "MM/dd/yyyy" : " "; };
    //When getting the value back out, use something like the following:
    DateTime? dt = (dateTimePicker1.Checked && dateTimePicker1.Value != dateTimePicker1.MinDate) ?  (DateTime?) dateTimePicker1.Value : null; 
    // or
    DateTime dt2 = (dateTimePicker1.Checked && dateTimePicker1.Value != dateTimePicker1.MinDate) ?  dateTimePicker1.Value : DateTime.MinValue; 

或者您可以将CustomFormat设置为"一个空白区域,如下面的内容

dateTimePicker1.CustomFormat= " ";

checkbox添加到datetime选择器属性:

string datevalue = dateTimePicker2.Checked != true ? "N/A": dateTimePicker2.Text;**

我认为这是不可能的,因为DateTime不可为null。

但是你可以这样使用DateTime.MinValue,你仍然可以很容易地比较

if (datetimepicker.DateTime == DateTime.MinValue)
{
  // just as good as null, maybe
}

我想知道是否可以将日期时间选择器日期设置为空

无法将DateTimePicker.Value设置为null,因为其类型不可为null。MSDN说:

如果代码或用户未更改Value属性,则设置为当前日期和时间(DateTime.Now)。

但这不是问题。您应该将某些绑定属性设置为null,而不是DateTimePicker.Value:

public class MyModel : INotifyPropertyChanged
{
    public DateTime? DateTimeFilter
    {
        get { return dateTimeFilter; }
        set
        {
            if (dateTimeFilter != value)
            {
                dateTimeFilter = value;
                OnPropertyChanged("DateTimeFilter");
            }
        }
    }
    private DateTime? dateTimeFilter;        
    // INotifyPropertyChanged implementation is omitted
}
public partial class Form1 : Form
{
    private readonly MyModel model;
    public Form1()
    {
        InitializeComponent();
        model = new MyModel();
        dateTimePicker1.DataBindings.Add("Value", model, "DateTimeFilter", true, DataSourceUpdateMode.OnPropertyChanged, DateTime.Now);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(model.DateTimeFilter.HasValue ? string.Format("User has selected '{0}'.", model.DateTimeFilter) : "User hasn't selected anything.");
    }
    private void button2_Click(object sender, EventArgs e)
    {
        // here's the data binding magic: our model's property becomes null, 
        // and datetimepicker's value becomes DateTime.Now, as it was initially set
        model.DateTimeFilter = null;
    }
}

DateTime的类型不可为null

但你可以这样做:
只需在日期选择器上添加一个复选框,就可以在属性中找到它,并将ShowCheckBox设置为True
你可以使用这个条件:

if(datePicker.Checked){
    //Do some stuff to ignore the Date Picker value
}

有关其他信息,我正在使用Microsoft Visual Studio 2010,我还没有检查其他IDE
希望得到帮助
干杯。。。

在SharePoint应用程序页面上使用DateTimeControl时,这对我很有用。

if (dtcOpenDate.SelectedDate != DateTime.Now)
{
    item["Open Date"] = dtcOpenDate.SelectedDate;    
}

此实现将原始Value属性替换为可为null的DateTime,该DateTime处理setter中的CheckBox状态。默认日期可以灵活设置,在我的情况下,年初日期更容易使用最小值或今天。设置自定义格式"当我觉得null没有改善用户体验,但可以随意更改时,我选择保持简单。

public class DateTimePickerAdvanced : DateTimePicker
{
    public DateTime DefaultDate { get; set; }
    public DateTimePickerAdvanced()
    {
        DefaultDate = new DateTime(2020, 01, 01);
    }
    public new DateTime? Value
    {
        get
        {
            return this.ShowCheckBox && !this.Checked ? null : (DateTime?)base.Value;
        }
        set
        {
            if (value == null && !this.ShowCheckBox)
            {
                throw new Exception("ShowCheckBox must be enabled in order to set DateTimePicker to null");
            }
            base.Value = value == null ? DefaultDate : (DateTime)value;
            if (this.ShowCheckBox)
            {
                if (value == null && this.Checked)
                {
                    this.Checked = false;
                }
                else if (value != null && !this.Checked)
                {
                    this.Checked = true;
                }
            }
        }
    }
}