2010-12-10 2 views
4

Я хочу, чтобы иметь возможность принимать дату NULL с помощью элемента управления DateTimePicker.WinForm DateTimePicker блюз. Это я?

Свойство «Проверено» предназначено для указания, будет ли элемент управления «содержать дату» или сейчас. Однако, когда «unchecked», дата все еще появляется, хотя она отключена. Для меня это отвлекает. Если цель флажка unchecked указывает, что нет значения даты, почему есть какое-либо значение даты, которое отключено или в противном случае оно появляется в текстовом поле? Мне кажется, что если элемент управления не отмечен, текстовое поле должно быть ПУСТОЙ и что вид замедленного значения даты, когда пользователь действительно хочет «нет значения», отвлекает.

Если пользователь включил этот флажок, то я хотел бы поместить значение по умолчанию в текстовое поле.

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

Я пробовал смотреть DateTimePicker Telerik, но попытка получить приличную функциональность обработки нулевого кода из этого элемента управления кажется хуже. Мне бы хотелось увидеть рабочий пример того, что один из вас считает удобным для пользователя примером кода, либо с помощью std MS, либо Telerik DateTimePicker, который принимает нулевой ввод.

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

EDIT:

См. Мой ответ ниже. Кажется, что все хорошо, теперь я просто хочу сделать его частью поведения каждого DateTimePicker.

+0

Не могу не упомянуть о перемещении в WPF, если у вас есть опция; это те типы проблем, которые могут быть легко исправлены в WPF по сравнению с WinForms. – 2010-12-10 15:19:28

+0

Просто для записи, это не вы. Элемент `DateTimePicker` дает * каждому * блюз. – 2010-12-10 16:01:24

+0

Спасибо. Самое удивительное в том, что Telerik, компания, известная большим контролем, выглядела еще хуже в этом отношении. Я бы предпочел использовать их контроль, потому что он, очевидно, более функциональный, но я тратил слишком много времени, пытаясь заставить его делать то, что сделал MS-контроль. Спасибо за ваш вклад. – ChadD 2010-12-10 16:21:22

ответ

0

Немного сложно получить права.Это выглядело хорошо:

Imports System.ComponentModel 

Public Class MyDateTimePicker 
    Inherits DateTimePicker 
    Implements ISupportInitialize 

    Public Sub New() 
     Me.ShowCheckBox = True 
     Me.NullDate = True 
    End Sub 

    Private CustomFormatBacking As String = "" 
    Private FormatBacking As DateTimePickerFormat = DateTimePickerFormat.Long 

    <DefaultValue(True)> _ 
    <Bindable(True)> _ 
    Public Property NullDate() As Boolean 
     Get 
      Return Not Me.Checked 
     End Get 
     Set(ByVal value As Boolean) 
      Me.Checked = Not value 
     End Set 
    End Property 

    <DefaultValue("")> _ 
    <Localizable(True)> _ 
    <RefreshProperties(RefreshProperties.Repaint)> _ 
    Public Shadows Property CustomFormat() As String 
     Get 
      Return CustomFormatBacking 
     End Get 
     Set(ByVal value As String) 
      CustomFormatBacking = value 
      If DesignMode Or Not NullDate Then MyBase.CustomFormat = value 
     End Set 
    End Property 

    <RefreshProperties(RefreshProperties.Repaint)> _ 
    Public Shadows Property Format() As DateTimePickerFormat 
     Get 
      Return FormatBacking 
     End Get 
     Set(ByVal value As DateTimePickerFormat) 
      FormatBacking = value 
      If DesignMode Or Not NullDate Then MyBase.Format = value 
     End Set 
    End Property 

    <DefaultValue(true)> _ 
    <Bindable(True)> _ 
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _ 
    Public Shadows Property Checked() As Boolean 
     Get 
      Return MyBase.Checked 
     End Get 
     Set(ByVal value As Boolean) 
      MyBase.Checked = value 
     End Set 
    End Property 

    Private Sub updateNullState() 
     If NullDate and Not DesignMode Then 
      MyBase.CustomFormat = " " 
      MyBase.Format = DateTimePickerFormat.Custom 
     Else 
      MyBase.CustomFormat = CustomFormatBacking 
      MyBase.Format = FormatBacking 
     End If 
    End Sub 

    Public Sub BeginInit() Implements System.ComponentModel.ISupportInitialize.BeginInit 
    End Sub 

    Public Sub EndInit() Implements System.ComponentModel.ISupportInitialize.EndInit 
     updateNullState() 
    End Sub 

    Protected Overrides Sub OnValueChanged(ByVal eventargs As System.EventArgs) 
     MyBase.OnValueChanged(eventargs) 
     updateNullState() 
    End Sub 

End Class 
1

У меня была та же проблема. Ну, на самом деле я достаточно умен, чтобы понять, но у моих пользователей была проблема.

Я решил удалить этот флажок и добавить 2 переключателя. Теперь кажется что-то вроде этого:

(с использованием псевдо UI)

O No value entered 
O | 1/1/2010 |V| 

Верхняя радиокнопку проверяется, когда нет никакого значения (нуля), нижней, когда есть значение. Я не скрываю или отключает нижний элемент управления, и пользователи, похоже, понимают.

Недостатком является то, что требуется гораздо больше места.

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

1

Klugey, но, похоже, он выполнил свою работу. Если флажок не установлен, принимайте значение NULL.

Private Sub DateTimePicker1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker1.ValueChanged 


    If DateTimePicker1.Checked Then 
     DateTimePicker1.Format = DateTimePickerFormat.Short 'Or whatever the original format was 
    Else 
     DateTimePicker1.Format = DateTimePickerFormat.Custom 
     DateTimePicker1.CustomFormat = " " 
    End If 

End Sub 

ОК, следующий вопрос ... Как я качусь это поведение в наследнике DateTimePicker? Я хочу сделать, чтобы зафиксировать исходные значения свойств Format и CustomFormat, заданные в окне «Свойства». Но это явно не способ сделать это.

Вот моя слабая попытка:

Public Class NullableDateTimePicker 

    Inherits DateTimePicker 

    Private _OriginalFormat As DateTimePickerFormat 
    Private _OriginalCustomerFormat As String 

    Private Sub NullableDateTimePicker_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ValueChanged 

     If Me.Checked Then 
      Me.Format = _OriginalFormat 
      Me.CustomFormat = _OriginalCustomerFormat 
     Else 
      Me.Format = DateTimePickerFormat.Custom 
      Me.CustomFormat = " " 
     End If 
    End Sub 

    Private Sub _DP_FormatChanged(ByVal sender As Object, ByVal e As System.EventArgs) 

     Static Count As Integer 

     If Count = 0 Then 
      _OriginalFormat = Me.Format 
      _OriginalCustomerFormat = Me.CustomFormat 
     End If 

     Count += 1 

    End Sub 

    Public Sub New() 
     AddHandler MyBase.FormatChanged, AddressOf _DP_FormatChanged 
    End Sub 
End Class 
1

Я понимаю, что это много лет после того, как ваш первоначальный вопрос, но вот подкласс Telerik RadDateTimePicker, что делает то, что вы просили:

Imports Telerik.WinControls.UI 

Public Class DateTimePickerWithNull 
    Inherits Telerik.WinControls.UI.RadDateTimePicker 

    Private ReadOnly _calendar As RadCalendar 

    Sub New() 
     Dim calendarBehavior As RadDateTimePickerCalendar = Me.DateTimePickerElement.GetCurrentBehavior() 
     calendarBehavior.DropDownMinSize = New Size(220, 150) 

     _calendar = calendarBehavior.Calendar 
     _calendar.ShowFooter = True 

     AddHandler _calendar.ClearButton.Click, AddressOf ClearButton_Click 
     AddHandler _calendar.TodayButton.Click, AddressOf TodayButton_Click 
    End Sub 

    Private Sub ClearButton_Click(sender As Object, e As EventArgs) 
     'Do this to put the calendar away 
     _calendar.SelectedDate = _calendar.FocusedDate 

     'Then clear 
     Me.SetToNullValue() 
    End Sub 

    Private Sub TodayButton_Click(sender As Object, e As EventArgs) 
     _calendar.SelectedDate = _calendar.FocusedDate 
    End Sub 

End Class 

Чтобы получить значение из сборщик:

If DateTimePicker1.Value.Date = DateTimePicker1.NullDate Then 
    Label1.Text = "Null" 
Else 
    Label1.Text = DateTimePicker1.Value.ToLongDateString 
End If 

 Смежные вопросы

  • Нет связанных вопросов^_^