DOBON.NET DOBON.NETプログラミング掲示板過去ログ

GroupBoxを超えたコントロールの描画

環境/言語:[VB.NET、.NET Framework2.0]
分類:[.NET]

いつも参考にさせていただいております。

現在TextBoxとMonthCalendarを合わせた
ユーザーコントロールを作成し、
GroupBox上に配置したところGroupBoxの境界で途切れてしまい困っています。
DateTimePickerのようにGroupBoxの境界で途切れず、
MonthCalendarを表示するにはどのようにしたら良いでしょうか?

補足ですが、DateTimePickerは必ず年月日を入れなければならず、
任意入力が実現できないため、使用しておりません。

知識不足で困っておりますので、
何卒ご教授頂けると助かります。
未入力に対応した日付入力用コントロールの
サンプルを書いてみました。
 
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
書き忘れたので、追記です

↑の私のコードは、DropDownがGroupBoxの境界で途切れず表示されます。
H.K.R.様

アドバイスありがとうございました。
上記のやり方で無事解決することができました。

DateTimePickerとTextBoxの組み合わせは
目から鱗でした。
サンプルまで載せていただき、
初心者の私でもできたので大変助かりました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板