- 題名: 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は必ず年月日を入れなければならず、
任意入力が実現できないため、使用しておりません。
知識不足で困っておりますので、
何卒ご教授頂けると助かります。