Как я могу заставить DateTimePicker отображать пустую строку? - PullRequest
58 голосов
/ 11 мая 2009

Я хотел бы иметь возможность отображать DateTimePicker, который по умолчанию имеет значение ничего, то есть нет даты.

Например, у меня есть дата начала dtTaskStart и дата окончания dtTaskEnd для задачи, но дата окончания неизвестна и изначально не заполняется.

Я указал пользовательский формат yyyy-MM-dd для обоих элементов управления.

Установка значения null, или пустая строка во время выполнения, вызывает ошибку, так как я могу это сделать?

Я рассмотрел возможность использования флажка для управления включением этого поля, но все еще существует проблема отображения начального значения ..

Edit:
Возможно, дубликат вопроса DateTimePicker Null Value (.NET) , но решение, которое я нашел для моей проблемы, не является решением этого вопроса, поэтому я думаю, что оно должно остаться здесь для других, чтобы найти .. 1021 *

Ответы [ 6 ]

46 голосов
/ 09 декабря 2011

Просто установите свойство следующим образом:

Когда пользователь нажимает «очистить кнопку» или «удалить ключ», сделайте

dtpData.CustomFormat = " "  'An empty SPACE
dtpData.Format = DateTimePickerFormat.Custom

Вкл. DateTimePicker1_ValueChanged событие до

dtpData.CustomFormat = "dd/MM/yyyy hh:mm:ss"
27 голосов
/ 11 мая 2009

Запутывание значения с помощью свойства CustomFormat с использованием флажка cbEnableEndDate в качестве флага, указывающего, должен ли другой код игнорировать значение:

If dateTaskEnd > Date.FromOADate(0) Then
    dtTaskEnd.Format = DateTimePickerFormat.Custom
    dtTaskEnd.CustomFormat = "yyyy-MM-dd"
    dtTaskEnd.Value = dateTaskEnd 
    dtTaskEnd.Enabled = True
    cbEnableEndDate.Checked = True
Else
    dtTaskEnd.Format = DateTimePickerFormat.Custom
    dtTaskEnd.CustomFormat = " "
    dtTaskEnd.Value = Date.FromOADate(0)
    dtTaskEnd.Enabled = False
    cbEnableEndDate.Checked = False
End If
20 голосов
/ 18 июня 2010

у меня это сработало для c #

if (enableEndDateCheckBox.Checked == true)
{
    endDateDateTimePicker.Enabled = true;
    endDateDateTimePicker.Format = DateTimePickerFormat.Short;                
}
else
{
    endDateDateTimePicker.Enabled = false;
    endDateDateTimePicker.Format = DateTimePickerFormat.Custom;
    endDateDateTimePicker.CustomFormat = " ";
}

Хороший, ребята!

5 голосов
/ 05 февраля 2014

В случае, если у кого-то возникнут проблемы с установкой пустым элемента управления datetimepicker во время события загрузки формы, а затем при необходимости отобразите текущую дату, вот пример:

УБЕДИТЕСЬ, ЧТО CustomFormat = " " имеет одинаковое количество пробелов (хотя бы один пробел) в обоих методах

Private Sub setDateTimePickerBlank(ByVal dateTimePicker As DateTimePicker)    

    dateTimePicker.Visible = True
    dateTimePicker.Format = DateTimePickerFormat.Custom
    dateTimePicker.CustomFormat = "    " 
End Sub


Private Sub dateTimePicker_MouseHover(ByVal sender As Object, ByVal e As 
                    System.EventArgs) Handles dateTimePicker.MouseHover

    Dim dateTimePicker As DateTimePicker = CType(sender, DateTimePicker)
    If dateTimePicker.Text = "    " Then
        dateTimePicker.Text = Format(DateTime.Now, "MM/dd/yyyy")
    End If
End Sub
4 голосов
/ 09 января 2016

Когда я хочу отобразить пустое значение даты, я делаю это

            if (sStrDate != "")
            {
                dateCreated.Value = DateTime.Parse(sStrDate);
            }
            else
            {
                dateCreated.CustomFormat = " ";
                dateCreated.Format = DateTimePickerFormat.Custom;
            }

Тогда, когда пользователь нажимает на элемент управления, у меня есть это:

            private void dateControl_MouseDown(object sender, MouseEventArgs e)
            {
                ((DateTimePicker)sender).Format = DateTimePickerFormat.Long;    
            }

Это позволяет вам отображать и использовать пустое значение даты, но все же позволяет пользователю иметь возможность изменить дату на что-либо, когда он пожелает.

Имейте в виду, что sStrDate уже был проверен как допустимая строка даты.

2 голосов
/ 16 мая 2017

Основная концепция та же, что и другие. Но проще реализовать этот способ, когда у вас есть несколько dateTimePicker.

dateTimePicker1.Value = DateTime.Now;
dateTimePicker1.ValueChanged += new System.EventHandler(this.Dtp_ValueChanged);
dateTimePicker1.ShowCheckBox=true;
dateTimePicker1.Checked=false;


dateTimePicker2.Value = DateTime.Now;
dateTimePicker2.ValueChanged += new System.EventHandler(this.Dtp_ValueChanged);
dateTimePicker2.ShowCheckBox=true;
dateTimePicker2.Checked=false;

значение измененной функции события

        void Dtp_ValueChanged(object sender, EventArgs e)
        {
            if(((DateTimePicker)sender).ShowCheckBox==true)
            {
                if(((DateTimePicker)sender).Checked==false)
                {
                    ((DateTimePicker)sender).CustomFormat = " ";
                    ((DateTimePicker)sender).Format = DateTimePickerFormat.Custom;
                }
                else
                {
                    ((DateTimePicker)sender).Format = DateTimePickerFormat.Short;
                }
            }
            else
            {
                ((DateTimePicker)sender).Format = DateTimePickerFormat.Short;
            }
        }

Когда не отмечен enter image description here

При проверке enter image description here

...