2つのDateTimePicker
コントロールを含むWinForms UIを開発しています。最初に、ユーザーが日付を選択するまで、コントロールの値をnullに設定します。ユーザーが日付を選択しない場合、データベースにはnullの値が渡されます。
デフォルトでは、現在の日付が使用されます。
何か提案したり、助けてくれるコードを添付していただけませんか。
MinDate
プロパティを設定しようとしましたが、機能しません。
コードはC#.Netにあります。
ありがとう、マナリ。
最善の解決策は、値が指定されているかどうかをユーザーに通知する組み込みチェックボックスを使用することだと思います。
コントロールプロパティ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.
}
私はこれが古い投稿であることを知っていますが、他の人はこれがまだ役に立つと思うかもしれません。それはかなりエレガントで簡潔です。これを.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;
DateTimePicker
コントロールにnull値を表示するには、_Designer.cs
_ファイルで次の変更を行います。
_this.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.DateTimePicker.CustomFormat = " ";
_
ユーザーが日付を選択したら、コントロールのValueChanged
プロパティをコードインし、必要に応じてフォーマットを作成します。これにより、コントロールに日付が表示されます。
上記のコントロールはUIで空白としてのみ表示されますが、デフォルト値は現在の日付のままです。
値をnullまたは空の文字列として設定/初期化する場合:
temp = DateTimePicker.CustomFormat.ToString();
これは私が見つけた最も簡単な回避策です。
dtpStartDate
がDateTimePickerコントロールであるとします。
このコードをPage_Load-に記述します
`dtpStartDate.Format = DateTimePickerFormat.Custom;
dtpStartDate.CustomFormat = " ";`
このコードをValue_Changedイベントに記述します-
`startDate = Convert.ToString(dtpStartDate.Value);
dtpStartDate.Format = DateTimePickerFormat.Short;`
ここでは、フォーマットとして「short」を選択しました。 「長い」と他の利用可能なオプションを選択できます。
TextBoxの外観を使用してUserControlを作成する必要があり、ユーザーがカレンダーショーをクリックしたときに、日付を選択したときに、TextBoxに設定します。 null値を許可します。
DateTimePickerはnullを許可しません。
これは、私が使用する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