Set Null value in DateTimePicker in C# - c#

I am developing a winform based Desktop application in C#. I would like the user to set the DateTimePicker to Null. I am developing a search box, and would like to ignore the date if it is set to Null
Here is what I am doing :
this.dateTimePicker2.CustomFormat = " ";
this.dateTimePicker2.Format = DateTimePickerFormat.Custom;
private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
{
this.dateTimePicker2.CustomFormat = "dd-MM-yy";
}
So far so good. However, once the user selects the date, the dateTimePicker2 control shows some date ( the date the user has selected). There is no way to set the date to null again. I am not keen to enable the checkbox associated with the datetimepicker control.
I was wondering if it is possible to set the datetimepicker date to null.
Thanks

This is in reference from a post that is old but other users on this site have posted it here you go
// 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;
or you can set the CustomFormat to " " an empty space like the following below
dateTimePicker1.CustomFormat= " ";

Add checkbox to your datetime picker property:
string datevalue = dateTimePicker2.Checked != true ? "N/A": dateTimePicker2.Text;**

I dont think its possible because DateTime is not nullable.
But you could use DateTime.MinValue this way tou can still compare easily
if (datetimepicker.DateTime == DateTime.MinValue)
{
// just as good as null, maybe
}

I was wondering if it is possible to set the datetimepicker date to null
There's no way to set DateTimePicker.Value to null, because its type isn't nullable. MSDN says, that:
If the Value property has not been changed in code or by the user, it
is set to the current date and time (DateTime.Now).
But this isn't a problem. You should set to null some bound property, not the 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 is not nullable type.
But you can do this trick:
Just add a checkbox on the date picker, you can find it on properties and set ShowCheckBox to True.
You can use this conditional:
if(datePicker.Checked){
//Do some stuff to ignore the Date Picker value
}
For additional info, I'm use Microsoft Visual Studio 2010, I'm not check the other IDE yet.
Hope this help. Cheers...

This worked for me when using a DateTimeControl on a SharePoint Application Page.
if (dtcOpenDate.SelectedDate != DateTime.Now)
{
item["Open Date"] = dtcOpenDate.SelectedDate;
}

This implementation replaces the original Value property with a nullable DateTime which handles the CheckBox state in the setter. The default date can be set flexibly, in my circumstance a start of year date is easier to work with then min value or today. Setting a custom format of " " when null i felt doesn't improve to user experience but feel free to change, I chose to keep it simple.
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;
}
}
}
}
}

Related

Validation for null value of datetime

I would like to make an if else statement in my view file. if the date is not null, it will show the edited date. if its null then it will show Unavailable. But the datetime value will never be null as when I try to debug, it will show the default value 1/1/0001 12:00:00
grid.Column("edited_on", "Edited On", format: (item) =>
{
if (item.edited_on.ToString() != "")
{
return Html.Raw(string.Format("{0:dd-MMM-yyyy}", item.edited_on));
}
else
{
return Html.Raw(string.Format("Unavailable"));
}
}),
I'm expecting a way to make a condition of when the date is null
if item.edited_on is a nullable field (i.e. datetime? instead of datetime) just check
if (item.edited_on != null)
{
return Html.Raw(string.Format("{0:dd-MMM-yyyy}", item.edited_on));
}
else
{
return Html.Raw(string.Format("Unavailable"));
}
if it is not nullable you can check it against default(DateTime):
if (item.edited_on != default(DateTime))
{
return Html.Raw(string.Format("{0:dd-MMM-yyyy}", item.edited_on));
}
else
{
return Html.Raw(string.Format("Unavailable"));
}

Check DateTime for null in linq expression

Is where a way to check if DateTime is null in linq expression? I've IEnumeable method where I'm returning data from database
return _requestRepository.ExecuteProcReader(
myRequest,
new SqlParameter("#userName", user)).Select(items => new Feed
{
Id = (int)items[0],
Title = items[1].ToString(),
Body = items[2].ToString(),
Link = items[3].ToString(),
PubDate = (DateTime) items[4]
});
And items[4] is a datetime which can be null in database. So, how can check something like
if(items[4] is DateTime)
{
PubDate = (DateTime) items[4]
}
One more option would be to declare PubDate as nullable inside class Feeddeclaration.
Like this:
class Feed {
public DateTime? PubDate {get;set;}
...
}
This will expose truth from database into data access layer and shift your null checks one level up.
See: Nullable types in c#
May be you can use ternary operator here.
return _requestRepository.ExecuteProcReader(myRequest,new SqlParameter("#userName", user)).Select(items => new Feed
{
Id = (int)items[0],
Title = items[1].ToString(),
Body = items[2].ToString(),
Link = items[3].ToString(),
PubDate = ((DateTime)items[4]).HasValue ? (DateTime) items[4] : DateTime.Now
//Or any date you want to use
});
You should also check for DBNull.Value when getting data from a database.
Here's what I'll do :
PubDate = (item[4] == null || item[4] == DBNull.Value ? DateTime.Now : (DateTime)item[4])
If you have multiple fields that can be NULL in database, you can put it in an extension method as :
public static object GetDBValue(this object value, object defaultValue)
{
return value == null || value == DBNull.Value ? defaultValue : value;
}
And call it with :
PubDate = (DateTime)date1.GetDBValue(DateTime.Now);

How To show blank datepicker when DB value is null

I've got a SQL DB column for DateTime Birthday on a customer object. The database allows that field to be null, but occasionally our users populate the data (from another system) with 1/1/1900.
I'd like to have my DatePicker field show nothing when the date in the DB is either null or DateTime.Parse("1900-01-01 00:00:00.000"). (It doesn't have to be fully blank, but can have the DatePicker field's standard default of " / / ".
I've been trying this:
dtBirthday.Value = customer.Birthday.HasValue ? customer.CustomerOptions.Birthday.Value : DateTime.Parse("1900-01-01 00:00:00.000");
That works fairly well for the null birthdays, but doesn't allow for the date in customer.Birthday actually being DateTime.Parse("1900-01-01 00:00:00.000").
Update
I did, in fact, google this, and attempted to use
var nullDate = DateTime.Parse("1900-01-01 00:00:00.000");
if (customer.Birthday.Value == nullDate)
{
dtBirthday.Format = eDateTimePickerFormat.Custom;
dtBirthday.CustomFormat = " ";
dtBirthday.Value = DateTime.FromOADate(0);
dtBirthday.Enabled = true;
}
else
{
dtBirthday.Format = eDateTimePickerFormat.Custom;
dtBirthday.CustomFormat = "M/d/yyyy";
dtBirthday.Value = customer.Birthday.Value;
dtBirthday.Enabled = true;
}
//dtBirthday.Value = customer.Birthday.HasValue ? customer.Birthday.Value : DateTime.Parse("1900-01-01 00:00:00.000");
if (customer.Anniversary.Value == nullDate)
{
dtAnniv.Format = eDateTimePickerFormat.Custom;
dtAnniv.CustomFormat = " ";
dtAnniv.Value = DateTime.FromOADate(0);
dtAnniv.Enabled = true;
}
else
{
dtAnniv.Format = eDateTimePickerFormat.Custom;
dtAnniv.CustomFormat = "MM/dd/yyyy";
dtAnniv.Value = customer.Anniversary.Value;
dtAnniv.Enabled = true;
}
//dtAnniv.Value = customer.Anniversary.HasValue ? customer.Anniversary.Value : DateTime.Parse("1900-01-01 00:00:00.000");
It does just about exactly what I want, except that the empty fields are completely disabled, even though I've specifically set them to enabled=true.
If I'm reading your question correctly, I think you want the text field to be empty when the birthday is actually null. Why not just populate it with an empty string:
txtBirthday.Value =
customer.Birthday.HasValue ?
customer.CustomerOptions.Birthday.Value.ToString() :
string.Empty;
After attempting several dozen different methods, none of which really did what I want, it occurred to me that I could just not set the value.
var nullDate = DateTime.Parse("1900-01-01 00:00:00.000");
if (customer.CustomerOptions.Birthday.HasValue && customer.CustomerOptions.Birthday.Value != nullDate)
{
dtBirthday.Value = customer.CustomerOptions.Birthday.Value;
}
if (customer.CustomerOptions.Anniversary.HasValue && customer.CustomerOptions.Anniversary.Value != nullDate)
{
dtAnniv.Value = customer.CustomerOptions.Anniversary.Value;
}

GetData include sometime is Null

I get data from my database with this code
var table = kantarDataSetTartimlarTableAdapter.GetData().Select(s => new
{
s.DateColumn,
s.Index
}).AsEnumerable().Select ((s, column) => new
{
s.DateColumn,
s.Index
column_no = column + 1
});
If date column is not null I haven't got any problem. But when date column have null data I have a problem:
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public System.DateTime event_start_date {
get {
try {
return ((global::System.DateTime)(this[this.tableDataTable1.event_start_dateColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'event_start_date\' in table \'DataTable1\' is DBNull.", e);
}
}
set {
this[this.tableDataTable1.event_start_dateColumn] = value;
}
}
How can I solve this error?
It appears your DB column & entity model are out of sync. If you are getting a null value back from the database then that field must be nullable. For that to map across to your model it must also support nullable dates.
You need to update event_start_date in your model to use Nullable<DateTime>/DateTime?.
You may try providing a default value when reading the value from your database to ensure you aren't storing any nulls:
DateColumn = s.DateColumn ?? DateTime.MinValue
I update event_start_date and I solve my problem
get {
try {
if (this[this.table.DateTimeColumn] is DBNull)
{
return Convert.ToDateTime(null);
}
else
{
return ((global::System.DateTime)(this[this.table.DateTimeColumn]));
}
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("Description", e);
}
}
set {
this[this.table.DateTimeColumn] = value;
}

Convert a datetime to string

Howsit!
I encounter an error when i get a null value in my datareader.
public List<Complaint> View_all_complaints()
{
csDAL objdal= new csDAL();
List<Complaint> oblcomplist=new List<Complaint>();
using( IDataReader dr=objdal.executespreturndr("View_all_complaints"))
{
while (dr.Read())
{
Complaint objcomp= new Complaint();
populate_reader(dr,objcomp);
oblcomplist.Add(objcomp);
}
}
return oblcomplist;
}
public void populate_reader(IDataReader dr, Complaint objcomp)
{
objcomp.ref_num = dr.GetString(0);
objcomp.type = dr.GetString(1);
objcomp.desc = dr.GetString(2);
objcomp.date = dr.GetDateTime(3);
objcomp.housenum = dr.GetInt32(4);
objcomp.streetnum = dr.GetInt32(5);
objcomp.status = dr.GetString(6);
objcomp.priority = dr.GetString(7);
objcomp.cid = dr.GetInt32(8);
if (!dr.IsDBNull(9))
{
objcomp.resolved_date = dr.GetDateTime(9);
}
}
in sql resolved date allows null values, this is so because only when a complaint has been resolved , it must reflect that date otherwise it should be null.
if dr.getdatetime(9) is null then it must just set a string saying "Not Resolved"
please help!
You haven't shown what your Complaint type looks like, but basically you'll want to make sure that its resolved_date is of type DateTime? aka Nullable<DateTime>. That allows you to model a missing value elegantly.
As for displaying it - you haven't shown anything about where you display the data, but you'd want something like:
string text = complaint.ResolvedDate.HasValue ? complaint.ResolvedDate.ToString()
: "Not Resolved";
(I've changed this to use a property with the idiomatic name at the same time...)
IDataReader has a "IsDBNull" method, that should be called before calling GetXXX(), in case your value is not nullable.
For example:
objcomp.date = dr.GetDateTime(3);
should be:
objcomp.date = dr.IsDBNull(3) ? DateTime.MinValue : dr.GetDateTime(3);

Categories

Resources