MinhKiyo
MinhKiyo

Reputation: 311

C# - How to disable some dates on a DateTimePicker?

I have two dateTimePicker and I choose date at first one and in second one it will automatically block possibility of choosing earlier date than the first one. I used the code as shown below, but the date does not show

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    //TODO SOMETHING (handle errors etc...)
    //...        

    dateTimePicker2.MinDate = dateTimePicker1.Value;
}

I want to show day, but is disabled can not choose ? Can do this? Please!

enter image description here

My code is below: Source code

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;

namespace formStudent
{
    public partial class formStudent : Form
    {
        List<Student> listStudent = new List<Student>();
        class Student
        {
            public string name { get; set; }
            public string gender { get; set; }
            public string birthday { get; set; }

            public Student(string inName, string inGender, string inBirthday)
            {
                name = inName;
                gender = inGender;
                birthday = inBirthday;
            }
        }
        public formStudent()
        {
            InitializeComponent();

            string[,] arrData = new string[10, 3] {
                                    { "Jane","Female","2016/08/11" },
                                    { "Peter","Female","2016/08/12" },
                                    { "John","Female","2016/08/13" },
                                    { "Ronaldo","Male","2016/08/14" },
                                    { "Jerry","Female","2016/08/15" },
                                    { "David","Female","2016/08/16" },
                                    { "Rooney","Male","2016/08/17" },
                                    { "Ozil","Male","2016/08/18" },
                                    { "Torres","Male","2016/08/19" },
                                    { "Messi","Male","2016/08/20" },
                                 };

            //Data row
            List<string> dataRow = new List<string>();

            //Data Student
            Student student = null;

            for (int row = 0; row < 10; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    dataRow.Add(arrData[row, col]);
                }

                student = new Student(dataRow[0], dataRow[1], dataRow[2]);
                //Get data student
                listStudent.Add(student);

                dataRow = new List<string>();
            }
        }

        // Filter 1
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            this.dataGridView.Rows.Clear();

            var filteredData = listStudent.Where(st => ((dateTimePicker1.Value <= DateTime.Parse(st.birthday).AddDays(1)) && (dateTimePicker2.Value >= DateTime.Parse(st.birthday))));
            List<Student> listData = new List<Student>(filteredData);
            displayData(listData);

            /**
             * dateTimePicker2.MinDate = dateTimePicker1.Value;
             */

        }

        // Filter 2
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            this.dataGridView.Rows.Clear();

            var filteredData = listStudent.Where(st => ((dateTimePicker1.Value <= DateTime.Parse(st.birthday).AddDays(1)) && (dateTimePicker2.Value >= DateTime.Parse(st.birthday))));
            List<Student> listData = new List<Student>(filteredData);
            displayData(listData);

            if (dateTimePicker2.Value < dateTimePicker1.Value.Date)
            {
                dateTimePicker2.Value = dateTimePicker1.Value.Date;
            }
        }

        private void dateTimePicker2_Enter(object sender, EventArgs e)
        {
            // temporarily set to an earlier date 
            dateTimePicker1.MinDate = new DateTime(1900, 1, 1);
        }

        private void dateTimePicker2_Leave(object sender, EventArgs e)
        {
            dateTimePicker2.MinDate = dateTimePicker1.Value.Date;
        }

        private void formStudent_Load(object sender, EventArgs e)
        {
            //Show data
            displayData(listStudent);
        }

        private void displayData(List<Student> listData)
        {
            //Show data
            foreach (Student item in listData)
            {
                int ii = this.dataGridView.Rows.Add();
                this.dataGridView.Rows[ii].Cells[0].Value = item.name;
                //Gender
                string strGender = string.Empty;
                if ("Male".Equals(item.gender))
                    strGender = "Male";
                else
                    strGender = "Female";
                this.dataGridView.Rows[ii].Cells[1].Value = strGender;
                this.dataGridView.Rows[ii].Cells[2].Value = item.birthday;

            }
        }
    }
}

Upvotes: 1

Views: 1891

Answers (1)

user6638270
user6638270

Reputation:

The only way I know to do this is as follows:

    private void dateTimePicker2_Enter(object sender, EventArgs e)
    {
        // temporarily set to an earlier date 
        dateTimePicker1.MinDate = new DateTime(1900, 1, 1);          
    }

    private void dateTimePicker2_Leave(object sender, EventArgs e)
    {
        dateTimePicker2.MinDate = dateTimePicker1.Value.Date;
    }

    private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
    {
        if (dateTimePicker2.Value < dateTimePicker1.Value.Date)
        {
            dateTimePicker2.Value = dateTimePicker1.Value.Date;
        }
    }

If you do this, then the earlier dates are not greyed-out (disabled), but any attempt to click on an earlier date, just leads to the date being set to the minimum.

Upvotes: 2

Related Questions