デザイン機能を無効にする方法についての特長や注意点については以下のとおりです。
この方法を推奨するケース
共通の継承コントロールの作成に向いています。基底クラスで一括してフィールドやサイドボタンを管理する場合にはこの方法が有効です。
この方法の特長
フォームにコントロールを配置した後でも、基底クラスの変更はリビルドすることで反映されます。
この方法の難点
- 継承コントロールのフィールドやサイドボタンを、個別にプロパティグリッドやスマートタグから編集することはできません。
- 基底クラスからショートカット機能の自動追加を無効にすることはできません。ショートカット機能を基底クラス側で設定した場合には、継承コントロール貼り付け後にフォーム側のショートカット機能を削除する必要があります。
- 基底クラスでサイドボタンを設定した場合、継承コントロールをフォームに配置したときには基底クラスで設定したサイドボタンは設定されず、デフォルトのサイドボタンが設定されたように表示されます。これは貼り付け時のみで、一度デザイン画面を閉じて再び開くか、またはリビルドを行うことで解消し、設定したサイドボタンが表示されるようになります。詳細については、下記の「サイドボタンのデザイン動作を回避する方法」を参照してください。
この方法を実装する際の注意点
- 引数のないコンストラクタと、IContainerを引数に取るコンストラクタの両方を実装します。
※引数なしのコンストラクタのみが実装されている場合、継承コントロールを配置したアプリケーションを実行すると例外が発生する場合があります。
- 基底クラスでフィールドやサイドボタンをあらかじめ追加しておく場合は、以下の点に留意します。
- 基底クラスのInitializeComponentメソッド内にはフィールドやサイドボタンを追加するコードを記述しません。これらのコードは「initializeCollections」等の別名のメソッド内に記述し、このメソッドをコンストラクタから呼び出す必要があります。
- 引数のないコンストラクタには、最初にフィールドとサイドボタンを消去する処理を記述します。
- 以下のメソッドを実装して基底クラスのデザイン機能が動作しないように設定します。
- Fields / ShouldSerializeFields
- DisplayFields / ShouldSerializeDisplayFields
- SideButtons / ShouldSerializeSideButtons
デザイン機能で自動に追加される動作を無効にする方法は、いくつかのメソッドを実装します。以下は日付時刻コントロールを継承したコントロールの実装例です。
Imports System.ComponentModel
Imports System.Drawing
Imports GrapeCity.Win.Editors
Imports GrapeCity.Win.Editors.Fields
Namespace MyGcDateTime
<LicenseProviderAttribute(GetType(LicenseProvider))> _
Public Class MyGcDateTime
Inherits GcDateTime
Public Sub New()
'
' 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
'
Me.Fields.Clear()
Me.DisplayFields.Clear()
Me.SideButtons.Clear()
initializeCollections()
End Sub
Public Sub New(ByVal container As IContainer)
MyBase.New(container)
initializeCollections()
End Sub
Private Sub initializeCollections()
'
' フィールドなどを初期化します。
'
Me.Fields.AddRange("yyyy/MM/dd")
Me.DisplayFields.AddRange("yyyy/M/d")
Me.SideButtons.Add(New DropDownButton())
Me.SideButtons.Add(New SpinButton())
Me.SideButtons(0).BackColor = Color.Red
Me.SideButtons(1).BackColor = Color.Blue
Me.FlatStyle = FlatStyleEx.Flat
' 注意:基底クラス側でショートカット機能を設定した場合には
' 継承コントロールを貼り付けるフォーム上のショートカット機能を
' 手動で削除する必要があります。
Dim newShortcut As New GcShortcut()
newShortcut.GetShortcuts(Me).Add(System.Windows.Forms.Keys.Enter, newShortcut, "NextControl")
End Sub
' 以下の2つのメソッドを実装することにより、
' 継承コントロールをフォームにドロップした時にコントロールに
' 入力フィールドが追加される動作を無効にします。
Public Shadows ReadOnly Property Fields() As DateTimeFieldCollection
Get
Return MyBase.Fields
End Get
End Property
Private Function ShouldSerializeFields() As Boolean
Return False
End Function
' 以下の2つのメソッドを実装することにより、
' 継承コントロールをフォームにドロップした時にコントロールに
' 表示フィールドが追加される動作を無効にします。
Public Shadows ReadOnly Property DisplayFields() As DateTimeDisplayFieldCollection
Get
Return MyBase.DisplayFields
End Get
End Property
Private Function ShouldSerializeDisplayFields() As Boolean
Return False
End Function
' 以下の2つのメソッドを実装することにより、
' 継承コントロールをフォームにドロップした時にコントロールに
' サイドボタンが追加される動作を無効にします。
Public Shadows ReadOnly Property SideButtons() As SideButtonCollection
Get
Return MyBase.SideButtons
End Get
End Property
Private Function ShouldSerializeSideButtons() As Boolean
Return False
End Function
End Class
End Namespace
using System.ComponentModel;
using System.Drawing;
using GrapeCity.Win.Editors;
using GrapeCity.Win.Editors.Fields;
namespace MyGcDateTime
{
[LicenseProviderAttribute(typeof(LicenseProvider))]
public class MyGcDateTime : GcDateTime
{
public MyGcDateTime()
{
//
// 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
//
this.Fields.Clear();
this.DisplayFields.Clear();
this.SideButtons.Clear();
initializeCollections();
}
public MyGcDateTime(IContainer container)
: base(container)
{
initializeCollections();
}
private void initializeCollections()
{
//
// フィールドなどを初期化します。
//
this.Fields.AddRange("yyyy/MM/dd");
this.DisplayFields.AddRange("yyyy/M/d");
this.SideButtons.Add(new DropDownButton());
this.SideButtons.Add(new SpinButton());
this.SideButtons[0].BackColor = Color.Red;
this.SideButtons[1].BackColor = Color.Blue;
this.FlatStyle = FlatStyleEx.Flat;
// 注意:基底クラス側でショートカット機能を設定した場合には
// 継承コントロールを貼り付けるフォーム上のショートカット機能を
// 手動で削除する必要があります。
GcShortcut newShortcut = new GcShortcut();
newShortcut.GetShortcuts(this).Add(System.Windows.Forms.Keys.Enter
, newShortcut
, "NextControl");
}
// 以下の2つのメソッドを実装することにより、
// 継承コントロールをフォームにドロップした時にコントロールに
// 入力フィールドが追加される動作を無効にします。
public new DateTimeFieldCollection Fields
{
get { return base.Fields; }
}
private bool ShouldSerializeFields()
{
return false;
}
// 以下の2つのメソッドを実装することにより、
// 継承コントロールをフォームにドロップした時にコントロールに
// 表示フィールドが追加される動作を無効にします。
public new DateTimeDisplayFieldCollection DisplayFields
{
get { return base.DisplayFields; }
}
private bool ShouldSerializeDisplayFields()
{
return false;
}
// 以下の2つのメソッドを実装することにより、
// 継承コントロールをフォームにドロップした時にコントロールに
// サイドボタンが追加される動作を無効にします。
public new SideButtonCollection SideButtons
{
get { return base.SideButtons; }
}
private bool ShouldSerializeSideButtons()
{
return false;
}
}
}
前項の方法を用いた場合、基底クラスでサイドボタンを設定していても、継承コントロールをフォームに配置したときには設定が反映されず、デフォルトのサイドボタンが設定されたように表示されてしまいます。この動作はフォームにコントロールを配置したときのみで一度デザイン画面を閉じ再び開くか、リビルドを行うことでデフォルトのサイドボタンは消え、基底クラスで設定したサイドボタンの設定が反映されます。
この動作を回避するためには、以下のようにコードを記述する方法があります。
 |
この問題は、サイドボタンのデザイン機能が反映されない以外、動作に影響を及ぼすことはありません。継承コントロールを配置後にリビルド等で設定を反映させた後は、再びそのコントロールのデザインが不正になることはありません。継承コントロールの配置状況や初回のデザインが不正であることの重要度などを考慮し、上記方法を採用するか、下記対応コードを採用するかを検討することを推奨します。 |
Imports System
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Windows.Forms
Imports GrapeCity.Win.Editors
Imports GrapeCity.Win.Editors.Fields
Namespace MyGcDateTime
<LicenseProviderAttribute(GetType(LicenseProvider))> _
Public Class MyGcDateTime2
Inherits GcDateTime
Public Sub New()
'
' 引数なしのコンストラクタのフィールドの消去処理を削除します。
'
initializeCollections()
End Sub
'
' 引数ありのコンストラクタを削除します。
'
Private Sub initializeCollections()
'
' フィールド、サイドボタン、ショートカット機能の初期化は下記に移動します。
'
Me.FlatStyle = FlatStyleEx.Flat
End Sub
' 以下の2つのメソッドを実装することにより、
' 継承コントロールをフォームにドロップした時にコントロールに
' 入力フィールドが追加される動作を無効にします。
Public Shadows ReadOnly Property Fields() As DateTimeFieldCollection
Get
Return MyBase.Fields
End Get
End Property
Private Function ShouldSerializeFields() As Boolean
Return False
End Function
' 以下の2つのメソッドを実装することにより、
' 継承コントロールをフォームにドロップした時にコントロールに
' 表示フィールドが追加される動作を無効にします。
Public Shadows ReadOnly Property DisplayFields() As DateTimeDisplayFieldCollection
Get
Return MyBase.DisplayFields
End Get
End Property
Private Function ShouldSerializeDisplayFields() As Boolean
Return False
End Function
' 以下の2つのメソッドを実装することにより、
' 継承コントロールをフォームにドロップした時にコントロールに
' サイドボタンが追加される動作を無効にします。
Public Shadows ReadOnly Property SideButtons() As SideButtonCollection
Get
Return MyBase.SideButtons
End Get
End Property
Private Function ShouldSerializeSideButtons() As Boolean
Return False
End Function
Protected Overloads Overrides Function GetDefaultFields() As DateField()
'
' デフォルトの入力フィールドを設定します。
'
Return DateFieldsBuilder.BuildFields("yyyy/MM/dd")
End Function
Protected Overloads Overrides Function GetDefaultDisplayFields() As DateDisplayField()
'
' デフォルトの表示フィールドを設定します。
'
Return DateDisplayFieldsBuilder.BuildFields("yyyy/M/d")
End Function
Protected Overloads Overrides Function GetDefaultSideButtonTypes() As List(Of Type)
'
' デフォルトのサイドボタンを設定します。
'
Dim defaultSideButtonTypes As New List(Of Type)()
defaultSideButtonTypes.Add(GetType(DropDownButton))
defaultSideButtonTypes.Add(GetType(SpinButton))
Return defaultSideButtonTypes
End Function
Protected Overloads Overrides Sub InitializeDefaultSideButtons(ByVal defaultSideButtons As SideButtonBase())
'
' デフォルトのサイドボタンを初期化します。
'
defaultSideButtons(0).BackColor = Color.Red
defaultSideButtons(1).BackColor = Color.Blue
End Sub
Protected Overloads Overrides Function GetDefaultShortcuts() As Dictionary(Of Keys, String)
'
' デフォルトのショートカット機能を設定します。
'
Dim defaultShortcuts As New Dictionary(Of Keys, String)()
defaultShortcuts.Add(Keys.Enter, "NextControl")
Return defaultShortcuts
End Function
End Class
End Namespace
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using GrapeCity.Win.Editors;
using GrapeCity.Win.Editors.Fields;
namespace MyGcDateTime
{
[LicenseProviderAttribute(typeof(LicenseProvider))]
public class MyGcDateTime2 : GcDateTime
{
public MyGcDateTime2()
{
//
// 引数なしのコンストラクタのフィールドの消去処理を削除します。
//
initializeCollections();
}
//
// 引数ありのコンストラクタを削除します。
//
private void initializeCollections()
{
//
// フィールド、サイドボタン、ショートカット機能の初期化は下記に移動します。
//
this.FlatStyle = FlatStyleEx.Flat;
}
// 以下の2つのメソッドを実装することにより、
// 継承コントロールをフォームにドロップした時にコントロールに
// 入力フィールドが追加される動作を無効にします。
public new DateTimeFieldCollection Fields
{
get { return base.Fields; }
}
private bool ShouldSerializeFields()
{
return false;
}
// 以下の2つのメソッドを実装することにより、
// 継承コントロールをフォームにドロップした時にコントロールに
// 表示フィールドが追加される動作を無効にします。
public new DateTimeDisplayFieldCollection DisplayFields
{
get { return base.DisplayFields; }
}
private bool ShouldSerializeDisplayFields()
{
return false;
}
// 以下の2つのメソッドを実装することにより、
// 継承コントロールをフォームにドロップした時にコントロールに
// サイドボタンが追加される動作を無効にします。
public new SideButtonCollection SideButtons
{
get { return base.SideButtons; }
}
private bool ShouldSerializeSideButtons()
{
return false;
}
protected override DateField[] GetDefaultFields()
{
//
// デフォルトの入力フィールドを設定します。
//
return DateFieldsBuilder.BuildFields("yyyy/MM/dd");
}
protected override DateDisplayField[] GetDefaultDisplayFields()
{
//
// デフォルトの表示フィールドを設定します。
//
return DateDisplayFieldsBuilder.BuildFields("yyyy/M/d");
}
protected override List<Type> GetDefaultSideButtonTypes()
{
//
// デフォルトのサイドボタンを設定します。
//
List<Type> defaultSideButtonTypes = new List<Type>();
defaultSideButtonTypes.Add(typeof(DropDownButton));
defaultSideButtonTypes.Add(typeof(SpinButton));
return defaultSideButtonTypes;
}
protected override void InitializeDefaultSideButtons(SideButtonBase[] defaultSideButtons)
{
//
// デフォルトのサイドボタンを初期化します。
//
defaultSideButtons[0].BackColor = Color.Red;
defaultSideButtons[1].BackColor = Color.Blue;
}
protected override Dictionary<Keys, string> GetDefaultShortcuts()
{
//
// デフォルトのショートカット機能を設定します。
//
Dictionary<Keys, string> defaultShortcuts = new Dictionary<Keys, string>();
defaultShortcuts.Add(Keys.Enter, "NextControl");
return defaultShortcuts;
}
}
}