質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

9735閲覧

Windows.FormsアプリケーションでのMVCを実現したい

shun_kuwa

総合スコア187

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2018/10/17 01:38

実現したいこと

タイトルの通り、WinFormsでのMVCパターンの実現方法に悩んでおります。
具体的には、ControllerクラスとFormクラス(View)の責務の分け方が曖昧な気がしています。

現状のソース例

C#

1 2// Formクラス 3public partial class SampleForm : Form 4{ 5 private SampleController controller; 6 7 // コンストラクタでコントローラーを初期化 8 public SampleForm() 9 { 10 InitializeComponent(); 11 this.controller = new SampleController(); 12 } 13 14 private void AButton_Clicked(object sender, EventArgs e) 15 { 16 this.controller.ExecuteA(); 17 } 18} 19 20// Controllerクラス 21public class SampleController 22{ 23 public SampleForm Form { get; set; } 24 25 public SampleController(SampleForm form) 26 { 27 this.SampleForm = form; 28 } 29 30 public void ExecuteA() 31 { 32 this.Form.Cursor = Cursors.WaitCursor; 33 34 // なんらかの処理 35 36 // Form内のListView等を操作したい場合に以下のような処理 37 this.Form.XXXXListView.Items[0] = XXXXXX 38 39 this.Form.Cursor = Cursors.Default; 40 } 41} 42

質問したいこと

ControllerのプロパティにFormをもつというクラス構造に違和感があります。
また、Cursorを変更するようなUI寄りの処理まで全てControllerでするのかという疑問もあります。

ただ、処理の途中でCursorを変えたいような場合にはController側で変更できた方が都合が良いです。
WinFormsのListViewはBindingできないよう(調べた限りできなさそうでした。間違っていたらすみません。)だったので、Controllerから直接ListViewコントロールを参照してデータを操作するしかないかと思ったのですがこれも少し気持ち悪いです。

質問内容が漠然としておりまたかなり古い話で申し訳ない(社内環境での制約があってWPFアプリケーションは現状利用できません。)のですが、どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Formって,V(表示箇所)であってC(操作受付)でもあるような存在だと思うので,
「"MVC"にしたいからVとCを切り分けよう」とかいうことに過剰に拘るよりも,
各クラスの役割(責務)を自分で決めて実装すればよいのではないかと.

  • SampleControllerは,SampleFormの具体的な実装(どんなコントロールがあって,そこに何をどう表示するのか等)までを知っていてそれを直接いじくるクラスになっていますが,そういうものに「したいのか」どうか.
  • SampleForm側は,SampleController.ExecuteA()が「長時間かかる可能性があることを知っている」存在なのかどうか.

など…

投稿2018/10/17 04:39

fana

総合スコア11656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun_kuwa

2018/10/17 05:37

ご回答ありがとうございます。確かに、ViewとControllerを分けることにこだわりすぎていたかもしれません。 クラスの責務を自分で決めて設計していこうと思います。 勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問