web-dev-qa-db-ja.com

DateTimePicker値をnullに設定します

2つのDateTimePickerコントロールを含むWinForms UIを開発しています。最初に、ユーザーが日付を選択するまで、コントロールの値をnullに設定します。ユーザーが日付を選択しない場合、データベースにはnullの値が渡されます。

デフォルトでは、現在の日付が使用されます。

何か提案したり、助けてくれるコードを添付していただけませんか。

MinDateプロパティを設定しようとしましたが、機能しません。

コードはC#.Netにあります。

ありがとう、マナリ。

10
Manali

最善の解決策は、値が指定されているかどうかをユーザーに通知する組み込みチェックボックスを使用することだと思います。

コントロールプロパティShowCheckBox = trueを設定します

値をそれにバインドすると、次のようになります

 if (value == DateTime.MinValue) {
    datePicker.Checked = false;
  } else {
    datePicker.Checked = true;
    datePicker.Value = value;
  }

値を読み戻すときは、Checkedプロパティを確認してください。

チェックされていないときに表示された値が気に入らない場合は、他の提案と組み合わせることができます。

  if (!datePicker.Checked) {
    // hide date value since it's not set
    datePicker.CustomFormat = " ";
    datePicker.Format = DateTimePickerFormat.Custom;
  } else {
    datePicker.CustomFormat = null;
    datePicker.Format = DateTimePickerFormat.Long; // set the date format you want.
  }
14
Zyo

私はこれが古い投稿であることを知っていますが、他の人はこれがまだ役に立つと思うかもしれません。それはかなりエレガントで簡潔です。これを.Net 4.0 DateTimePickerで使用しましたが、以前のバージョンは最小限の調整で機能するはずです。 MinDateとCheckedを利用します。

    // 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; 
8
K Kimble

DateTimePickerコントロールにnull値を表示するには、_Designer.cs_ファイルで次の変更を行います。

_this.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.DateTimePicker.CustomFormat = " ";
_

ユーザーが日付を選択したら、コントロールのValueChangedプロパティをコードインし、必要に応じてフォーマットを作成します。これにより、コントロールに日付が表示されます。

上記のコントロールはUIで空白としてのみ表示されますが、デフォルト値は現在の日付のままです。

値をnullまたは空の文字列として設定/初期化する場合:

  1. tempと言う一時的な文字列変数を宣言する
  2. temp = DateTimePicker.CustomFormat.ToString();
  3. tempが空の文字列かどうかを確認します。その場合は、必要に応じて処理してください。

これは私が見つけた最も簡単な回避策です。

3
Manali

dtpStartDateがDateTimePickerコントロールであるとします。

このコードをPage_Load-に記述します

`dtpStartDate.Format = DateTimePickerFormat.Custom;
            dtpStartDate.CustomFormat = " ";`

このコードをValue_Changedイベントに記述します-

`startDate = Convert.ToString(dtpStartDate.Value);
        dtpStartDate.Format = DateTimePickerFormat.Short;`

ここでは、フォーマットとして「short」を選択しました。 「長い」と他の利用可能なオプションを選択できます。

2
Bhaskar Jain

これがお役に立てば幸いです Link1ピッカーフィールドに空白を表示するには

そしてこれも Link2

1
V4Vendetta

TextBoxの外観を使用してUserControlを作成する必要があり、ユーザーがカレンダーショーをクリックしたときに、日付を選択したときに、TextBoxに設定します。 null値を許可します。

DateTimePickerはnullを許可しません。

1
JTorrecilla

これは、私が使用するnull可能な日時ピッカーのコードです。

    Public Class DateTimePickerNullable
    Inherits DateTimePicker

    Public Shadows Event GotFocus(sender As Object, e As EventArgs)
    Public Shadows Event LostFocus(sender As Object, e As EventArgs)

    Private fvalue As DateTime?
    Private NoValueChange As Boolean = False
    Public Shadows Property Value As DateTime?
        Get
            Return fvalue
        End Get
        Set(value As DateTime?)
            fvalue = value
            If fvalue Is Nothing Then
                Me.Format = DateTimePickerFormat.Custom
                Me.CustomFormat = Space(Now.ToShortDateString.Length)
                NoValueChange = True
                MyBase.Value = Now
                NoValueChange = False
            Else
                Me.Format = DateTimePickerFormat.Short
                NoValueChange = True
                MyBase.Value = value.Value
                NoValueChange = False
            End If
        End Set
    End Property

    Protected Overrides Sub OnValueChanged(eventargs As EventArgs)
        If Not NoValueChange Then
            Value = MyBase.Value
        End If
        MyBase.OnValueChanged(eventargs)
    End Sub

    Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
        If e.KeyCode = Keys.Delete Then
            Value = Nothing
        End If
        If Me.Format = DateTimePickerFormat.Custom Then
            Try
                If Char.IsNumber(ChrW(e.KeyCode)) Then
                    If Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern.ToLower.StartsWith("m") Then
                        Value = New Date(Now.Year, CInt(ChrW(e.KeyCode).ToString), Now.Day)
                    Else
                        Value = New Date(Now.Year, Now.Month, CInt(ChrW(e.KeyCode).ToString))
                    End If
                    SendKeys.Send(ChrW(e.KeyCode))
                    Exit Sub
                End If
            Catch
            End Try
        End If
        MyBase.OnKeyDown(e)
    End Sub

    Private HasFocus As Boolean = False
    Protected Overrides Sub OnGotFocus(e As EventArgs)
        MyBase.OnGotFocus(e)
        If Not HasFocus Then
            HasFocus = True
            RaiseEvent GotFocus(Me, New EventArgs)
        End If
    End Sub

    Protected Overrides Sub OnValidated(e As EventArgs)
        MyBase.OnValidated(e)
        HasFocus = False
        RaiseEvent LostFocus(Me, New EventArgs)
    End Sub
End Class
0
Theo Verweij