ビュー デザイナー (View Designer) / デザイナー (Designer)

操作対象ごとに、

  • Windows フォーム デザイナー
  • Web フォーム デザイナー
  • XAML デザイナー

などがあります。

生成されるコード

Windows フォーム

コードの記述順

#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に変更してみます。

'index' に対して有効ではない

'0' の InvalidArgument=Value は 'index' に対して有効ではありません。パラメーター名:index (InvalidArgument=Value of '0' is not valid for 'index'. Parameter name: index)」としてArgumentOutOfRangeExceptionが投げられるならば、描画に関する処理を確認します。

StronglyTypedResourceBuilder.Create()でNullReferenceExceptionが投げられる

オブジェクト参照がオブジェクト インスタンスに設定されていません。」として失敗するときに、スタックトレースの最後がStronglyTypedResourceBuilder.Create()となっているならば、リソースに問題がないか確認します。

解決できないエラー

ビュー デザイナーを開いたときに「値が有効な範囲にありません。 」「キーを *** にすることはできません。」などとしてデザイナの表示に失敗することがあります。

原因を特定できず解決できないならば、とりあえずVisual Studioを再起動してみます。それで解決されることがあります。

コントロールを追加できない

ツールボックスからの読み込みに失敗する

ツールボックスからアイテムを追加したときに「ツールボックス アイテム 'Item' の読み込みに失敗しました。アイテムはツールボックスから削除されます。」として失敗することがあります。このときソリューションのプラットフォームをx64としているならば、これをAny CPUやx86に変更して再試行します。

abstractとして宣言されているため、作成できない

デザイナーは型 '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

DesignerSerializationVisibility列挙型
列挙子 内容
Hidden オブジェクトのコードは生成されない
Visible オブジェクトのコードは生成される
Content オブジェクト自体のコードではなく、オブジェクトの内容のコードが生成される
DesignerSerializationVisibility 列挙型 (System.ComponentModel) | Microsoft Learn

一方でそれがデザイン時には不要な処理に起因するものならば、そのときには処理されないようにコードで分岐させます。 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)
{
    // デザイン モードでは不要な処理
}

32ビット アセンブリを読み込めない

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) で読み込むことを求められます。

Microsoft Learnから検索