操作対象ごとに、
などがあります。
「#region Windows フォーム デザイナーで生成されたコード
」範囲内のコードは、コントロールを追加した順に記述されます。これを変更するには、コントロールがnewで生成される順を書き換えます。そしてデザイナーで何らかの変更を加えて更新すると、それ以下のプロパティの設定部の順もそれに合うように並べ替えられます。
「#endregion
」以下のフィールド宣言部もコントロールの追加順に記述されますが、これの記述順を書き換えてもデザイナの影響は受けません。
コントロールをロックしておくことで、意図しない位置や大きさの変更を防止できます。.NET TIPS Windowsフォーム上のコントロールの位置やサイズを固定するには? - C# VB.NET - @IT 一色政彦 (2005/03/11)
これはメニューの【書式 → コントロールのロック】から設定できます。
ビュー デザイナーを開いたときに「System.Windows.Forms.Design.ISelectionUIService は既にサービス コンテナーに存在します。パラメータ名: serviceType (The service System.Windows.Forms.Design.ISelectionUIService already exists in the service container. Parameter name: serviceType)」としてデザイナの表示に失敗することがあります。
Formに、コントロールを継承した独自のコントロールが追加されているときに発生します。まずはVisual Studioを再起動してみます。それでも解決されないならば、プロジェクトのobjとbinフォルダを削除してみます。c# - Error : The service System.Windows.Forms.Design.IEventHandlerService already exists in the service container - Stack Overflow
ビュー デザイナーを開いたときに「型 'ClassName' が見つかりませんでした。 この型を含むアセンブリが参照されていることを確認してください。 この型が開発プロジェクトの一部である場合は、現在のプラットフォームまたは Any CPU の設定を使用して、プロジェクトが正常にビルドされていることを確認してください。 」としてデザイナの表示に失敗することがあります。
このときソリューションのプラットフォームをx64としているならば、これをAny CPUやx86に変更して再試行します。Visual Studio 2022より前は64ビットのアセンブリを読み込めないため、プロジェクトが正常にビルドされていてもこの問題は発生します。.net - Could not find type 'xxx.xxx.xxx'. Please make sure that the assembly - Stack Overflow
「ファイル内にデザインできるクラスがないため、このファイルのデザイナーを表示できませんでした。 ファイルの以下のクラスがデザイナーで見つかりました: *** --- 基本クラス '***' を読み込めませんでした。 アセンブリが参照されているか、およびすべてのプロジェクトがビルドされているかを確認してください。」として表示に失敗するときも、プラットフォームをAny CPUやx86に変更してみます。
「'0' の InvalidArgument=Value は 'index' に対して有効ではありません。パラメーター名:index (InvalidArgument=Value of '0' is not valid for 'index'. Parameter name: index)」としてArgumentOutOfRangeExceptionが投げられるならば、描画に関する処理を確認します。
ビュー デザイナーを開いたときに「値が有効な範囲にありません。 」「キーを *** にすることはできません。」などとしてデザイナの表示に失敗することがあります。
原因を特定できず解決できないならば、とりあえずVisual Studioを再起動してみます。それで解決されることがあります。
ツールボックスからアイテムを追加したときに「ツールボックス アイテム 'Item' の読み込みに失敗しました。アイテムはツールボックスから削除されます。」として失敗することがあります。このときソリューションのプラットフォームをx64としているならば、これをAny CPUやx86に変更して再試行します。
「デザイナーは型 'ClassName' のインスタンスを作成しなければなりませんが、型が abstract として宣言されているため、作成できませんでした。 」
仕様です。abstractを外すか、デザイナで開くことをあきらめます。デザイナーは型 '<type name>' のインスタンスを作成しなければなりませんが、型が abstract として宣言されているため、作成できませんでした - Windows フォーム デザイナーでのデザイン時エラー | Microsoft Learn
「プロパティ 'PropertyName' のコード生成に失敗しました。」として失敗するときは、それに続くエラーメッセージの内容に対処します。
コントロールを継承したクラスでプロパティの既定値を書き替えていると、それを利用するコントロールをデザイナーで開いたときに、そこでもプロパティが設定されます。これは継承したクラスのプロパティに、
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public override string Text { ... }
のようにDesignerSerializationVisibilityAttribute属性でDesignerSerializationVisibility列挙型の値を指定することで、コードの生成を抑制できます。c# winform : override default properties in designer from custom control - Stack Overflow DesignerSerializationVisibilityAttribute クラス (System.ComponentModel) | Microsoft Learn
列挙子 | 内容 |
---|---|
Hidden | オブジェクトのコードは生成されない |
Visible | オブジェクトのコードは生成される |
Content | オブジェクト自体のコードではなく、オブジェクトの内容のコードが生成される |
一方でそれがデザイン時には不要な処理に起因するものならば、そのときには処理されないようにコードで分岐させます。 c# - Detecting design mode from a Control's constructor - Stack Overflow LicenseUsageMode Enum (System.ComponentModel) | Microsoft Learn
アクティブなプロセス名、
if (Process.GetCurrentProcess().ProcessName != "devenv") { // デザイン モードでは不要な処理 }
または、現在のコンテキストのライセンス オブジェクトがデザイン時に使用できるかどうかで
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
{
// デザイン モードでは不要な処理
}
のように判定できます。Componentから派生しているクラスならば、コンストラクタ以外ではそのDesignModeプロパティでも判定できます。
if (!DesignMode)
{
// デザイン モードでは不要な処理
}
「Visual Studio は 32 ビット アセンブリ '***.DLL' を読み込めません。'***' プロジェクトに Windows フォームのプロセス外デザイナーを使用しますか?」 winforms/docs/designer/designer-selection.md at main · dotnet/winforms · GitHub .NET Framework からのデザイナーの変更 - Windows Forms .NET | Microsoft Learn
Visual Studioが64ビットのプロセスであるために、32ビットのアセンブリを読み込めないときに、それをプロセス外デザイナー (out-of-process designer) で読み込むことを求められます。