- 題名: GroupBoxを超えたコントロールの描画
- 日時: 2009/05/15 20:56:58
- ID: 24570
- この記事の返信元:
- (なし)
- この記事への返信:
- [24572] Re[1]: GroupBoxを超えたコントロールの描画2009/05/16 1:48:35
- ツリーを表示
未入力に対応した日付入力用コントロールの
サンプルを書いてみました。
Controlの上にDateTimePickerを配置し、
その上にTextBoxを配置しています。
DateTimePickerは、DropDownを表示する目的で
使っています。
TextBoxのTextをNullable(Of DateTime)型に
変換したものを、Valueプロパティで公開しています。
テスト用Formのコードとともに掲載します。
参考になれば幸いです。
''' <summary>
''' Controlの上にDateTimePicker、その上にTextBoxを配置した
''' 複合コントロール
''' </summary>
Public Class NullableDateTimePicker
Inherits Control
Private WithEvents DateTimePicker1 As New DateTimePicker
Private WithEvents TextBox1 As New TextBox
''' <summary>日付が変更された時に発行されるイベント</summary>
Public Event ValueChanged As EventHandler
Protected Overridable Sub OnValueChanged(ByVal e As EventArgs)
RaiseEvent ValueChanged(Me, e)
End Sub
Public Sub New()
With Me.DateTimePicker1
.Location = New Point(0, 0)
.Value = DateTime.Now.Date
End With
With Me.TextBox1
.Location = New Point(0, 0)
End With
Me._resizeChildControls()
Me._setText()
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.DateTimePicker1)
End Sub
Private Sub _setText()
Me.TextBox1.Text = Me.DateTimePicker1.Value.ToString("yyyy/MM/dd")
End Sub
Private Sub DateTimePicker1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles DateTimePicker1.ValueChanged
Me._setText()
Me.OnValueChanged(EventArgs.Empty)
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles TextBox1.TextChanged
Me.OnValueChanged(EventArgs.Empty)
End Sub
Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
Me._resizeChildControls()
MyBase.OnSizeChanged(e)
End Sub
Private Sub _resizeChildControls()
Me.DateTimePicker1.Size = Me.Size
Me.TextBox1.Size = New Size(Me.Width - SystemInformation.VerticalScrollBarWidth, Me.Height)
End Sub
''' <summary>
''' 日付を、Nullable(Of DateTime)型で取得または設定します
''' </summary>
Public Property Value() As Nullable(Of DateTime)
Get
Dim dt As DateTime
If DateTime.TryParse(Me.TextBox1.Text, dt) Then
Return New Nullable(Of DateTime)(dt)
Else
Dim ndt As New Nullable(Of DateTime)
ndt = Nothing
Return ndt
End If
End Get
Set(ByVal value As Nullable(Of DateTime))
If value.HasValue Then
Me.DateTimePicker1.Value = value.Value
Me._setText()
Else
Me.TextBox1.Text = ""
End If
Me.OnValueChanged(EventArgs.Empty)
End Set
End Property
End Class
''' <summary>
''' テスト用Form(NullableDateTimePicker1と、btnNow、btnNULLをデザイナで配置)
''' </summary>
Public Class Form3
Private Sub NullableDateTimePicker1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles NullableDateTimePicker1.ValueChanged
Dim dt As Nullable(Of DateTime) = Me.NullableDateTimePicker1.Value
If dt.HasValue Then
Me.Text = dt.Value.ToString("yyyy/MM/dd")
Else
Me.Text = "NULL"
End If
End Sub
Private Sub btnNow_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNow.Click
Me.NullableDateTimePicker1.Value = DateTime.Now
End Sub
Private Sub btnNULL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNULL.Click
Me.NullableDateTimePicker1.Value = Nothing
End Sub
End Class
分類:[.NET]
いつも参考にさせていただいております。
現在TextBoxとMonthCalendarを合わせた
ユーザーコントロールを作成し、
GroupBox上に配置したところGroupBoxの境界で途切れてしまい困っています。
DateTimePickerのようにGroupBoxの境界で途切れず、
MonthCalendarを表示するにはどのようにしたら良いでしょうか?
補足ですが、DateTimePickerは必ず年月日を入れなければならず、
任意入力が実現できないため、使用しておりません。
知識不足で困っておりますので、
何卒ご教授頂けると助かります。