PowerTools InputMan for Windows Forms 8.0J > InputManの使い方 > 継承コントロールのデザイン機能 > デザイン機能を無効にする方法 |
各機能が自動に追加されるデザイン機能を無効にし、実行時にフィールドやサイドボタン、ショートカット機能を設定するためには、以下の点について考慮する必要があります。
デザイン機能を無効にする方法についての特長や注意点については以下のとおりです。
共通の継承コントロールの作成に向いています。基底クラスで一括してフィールドやサイドボタンを管理する場合にはこの方法が有効です。
フォームにコントロールを配置した後でも、基底クラスの変更はリビルドすることで反映されます。
デザイン機能で自動に追加される動作を無効にする方法は、いくつかのメソッドを実装します。以下は日付時刻コントロールを継承したコントロールの実装例です。
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; } } }