78218


タイトルの件、同じ画面Formのデザインを使用して、本番運用用の画面とテスト用の画面で表示内容を分けて表示したいと思い、以下の構成で検討しています。  
開発環境は、Visual Studio 2019  
.NET Framework 4.7.2です。

本番用ソリューション  
|-画面プロジェクトA  
|-SampleForm.cs → 本番用の画面処理(DBからデータ取得)を記述  
|-SampleForm.Designer.cs

テスト用ソリューション  
|-画面プロジェクトA  
|-SampleForm.cs → テスト用の画面処理(サンプルデータを表示だけ)を記述  
|-SampleForm.Designer.cs

このとき、デザインだけは、本番用の最新のデザインをテスト用ソリューションと共有したいので、更新があれば、SampleForm.Designer.csだけをテスト用ソリューション側にコピーして、SampleForm.csは、テスト用ソシューションの内容のままで更新しないようにすれば、SampleForm.Designer.csだけ、それぞれのソリューションで同期すればよいと思いましたが、実際やってみると、イベントハンドラーの設定部分もSampleForm.Designer.csに自動で実装されてしまうため、本番用画面にだけ実装されているイベントハンドラーがあると、例えば以下のようなコードでbutton1_Clickがテスト用のSampleForm.csには存在しないこともあるため、コンパイルエラーになってしまいます。

[code]

    this.button1.Click += new System.EventHandler(this.button1_Click);
    
[/code]

上記のようなことを実現したい場合、イベントハンドラの設定もSampleForm.cs側に記述すれば良いでしょうか？または、別の良いやり方があればご教示いただきたいです。


CC BY-SA 4.0
2021-07-16T01:21:44.383
78216
2021-07-18T01:24:36.970
2021-07-18T01:24:36.970
9228
9228
question
c# winforms
Form画面のデザイン部分だけ、共有して処理部分を別々のファイルで管理したい


SampleForm.cs側でイベントハンドラ設定するか、イベントハンドラを除去したDesigner.csのソースを出力するビルドイベントみたいなのを実行するかくらいかな…という気がします。  
SampleForm.cs側で設定するとイベントハンドラのメソッド作成が割と手間なので、やはりビルドイベント等で自動化するのがベターかなと思います。


CC BY-SA 4.0
2021-07-16T01:40:02.267
78218
2021-07-16T01:51:14.993
2021-07-16T01:51:14.993
41943
41943
78216
answer


質問するときは環境に関する情報を詳しく記述しましょう。

  * [技術系メーリングリストで質問するときのパターン・ランゲージ](https://www.hyuki.com/writing/techask.html#env)

まずはVisual Studioのバージョンや、ターゲットフレームワークのバージョン (.NET Frameworkまたは.NET Coreのバージョン)
を提示してください。バージョンによって利用できる機能が変わるため、回答も変わる可能性があります。

ひとまずVisual Studio 2015以降、.NET Framework 4.5以降の環境であると仮定します。

Windows FormsはDelphiのVCLに近い設計となっており、ユーザー定義のフォームやコントロールも、 **継承**
により再利用することができます。  
基底クラスのソースファイル一式をソリューションごとにコピー＆ペーストする手もありますが、まず「Windows フォーム コントロール
ライブラリ」のプロジェクトを別途作成して、その中で再利用したいフォームの基底クラスを定義し、DLL化して共有することをお勧めします。

  * [コントロールから継承する - Windows Forms .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/walkthrough-inheriting-from-a-windows-forms-control-with-visual-csharp?view=netframeworkdesktop-4.8)
  * [フォームの継承 - Windows Forms .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/advanced/how-to-inherit-windows-forms?view=netframeworkdesktop-4.8)
  * [コントロールの開発の基本 - Windows Forms .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/windows-forms-control-development-basics?view=netframeworkdesktop-4.8)

コントロールライブラリのプロジェクトテンプレートは、デフォルトで`UserControl1`が定義された状態になりますが、フォームを追加することも可能です。

ビルド済みのDLLアセンブリをEXEプロジェクトの参照設定に追加するか、あるいはDLLプロジェクトをソリューションに追加し、EXEプロジェクトの参照設定に追加することで、フォームの基底クラスを利用できるようになります。

ただし、フォーム上に配置した`Button`などのコントロールのフィールドは、アクセスレベルが`private`となるので、派生クラスからは直接アクセスできません。  
読み取り専用プロパティなどのアクセサーを定義するか、フォームにカスタムイベントを定義して、転送できるようにします。

[code]

            public Button Button1
            {
                get { return this.button1; }
            }
    
[/code]

または

[code]

            public event EventHandler Button1Click
            {
                add { this.button1.Click += value; }
                remove { this.button1.Click -= value; }
            }
    
[/code]

追加したカスタムイベントは、 **派生クラス** のフォームデザイナーのプロパティウィンドウにて、「その他」カテゴリーに表示されるようになります。  
※実際には、フィールドやプロパティ、イベントには、もっと分かりやすい名前を付けるようにしてください。


CC BY-SA 4.0
2021-07-17T08:40:22.753
78246
2021-07-17T08:40:22.753
15413
78216
answer


質問タイトルは一般化されていますが、実際に求められているのは本番とテストの２パターンのみでしょうか？  
そうであれば、プロジェクトを統合し、内部でコード分岐されることをお勧めします。統合されていれば一方の変更を他方へ反映しそびれることがありません。

プロジェクトは既定でDebug /
Releaseの２つの構成だけが用意されていますが、独自に追加することも可能です。TestDebug（必要であればTestReleaseも）を追加し、シンボルを定義すれば、
`#if` ～ `#endif` でコード分岐させることができます。


CC BY-SA 4.0
2021-07-17T08:50:01.697
78247
2021-07-17T08:50:01.697
4236
78216
answer