WinForm DateTimePicker блюз.Это я? - PullRequest
       7

WinForm DateTimePicker блюз.Это я?

4 голосов
/ 10 декабря 2010

Я хочу принять NULL-дату, используя элемент управления DateTimePicker.

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

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

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

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

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

EDIT:

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

Ответы [ 4 ]

1 голос
/ 08 апреля 2014

Я понимаю, что это спустя много лет после вашего первоначального вопроса, но вот подкласс 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
1 голос
/ 10 декабря 2010

Клугей, но похоже, что работа сделана.Если флажок не установлен, примите значение 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, как установлено в окне Properties.Но это явно не способ сделать это.

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

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 голос
/ 10 декабря 2010

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

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

(с использованием псевдоинтерфейса)

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

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

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

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

0 голосов
/ 10 декабря 2010

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

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
...