ページ 11

[C#]コントロール間の連携

Posted: 2013年8月23日(金) 13:01
by オカピーα
お久しぶりです、いつもお世話になっております。
C言語掲示板なのにC#の質問で大変恐縮ですが、質問させていただきます。

現在、添付画像のような左ペインにフォルダツリーを、右ペインにタブ型テキストという配置の
テキストエディタをC#で作成しています。
そこで、ツリービューとタブコントロールを別途ファイルにて作成し、
各々独立したクラスとして作りました。
その結果、ツリービューは正常に動作するようになり、万々歳だとはしゃいでいたら
大変な問題が浮上しました。

ツリービューでは、内部にダブルクリック時に発生するイベントを用意しています。
よって、ダブルクリックされたときにタブコントロールにタブを追加するだけと
思っていたら、その方法がまったく分かりません。
というのも、ツリービュークラス内部からはタブコントロールにアクセスできないからです。
そのため、今のところ2つの解決方法を考えてみました。

1.ツリービューにコンストラクタを持たせ、そのコンストラクタに
タブコントロールを渡し、いじくる
2.イベントを実装する(まったく分からない)

ほかにはどのような方法があるのでしょう?
このような問題はソフトウェア制作時に頻出するとは思うのですが
まったく文献等も見当たらず、困っております。

どなたかご存知の方いらっしゃいましたら、よろしくお願い申し上げます。

Re: [C#]コントロール間の連携

Posted: 2013年8月23日(金) 13:38
by バグ
>>1.ツリービューにコンストラクタを持たせ、そのコンストラクタに
タブコントロールを渡し、いじくる
>>2.イベントを実装する(まったく分からない)

基本は2ですね。
というか、個人的には1は論外です。

一番分かりやすいのは、「TreeViewでダブルクリックイベント発生→Formにてイベントを検知→FormからTabControlの処理を行う」という流れかと思います。


イベントの実装が分からないということですが、ボタンクリックイベントとかの実装をしたことはありますか?

Re: [C#]コントロール間の連携

Posted: 2013年8月23日(金) 17:19
by ISLe
オカピーα さんが書きました:このような問題はソフトウェア制作時に頻出するとは思うのですが
まったく文献等も見当たらず、困っております。
オブジェクト指向設計に関する書籍等をあたれば基本として書かれていると思います。

隣同士の関係のオブジェクトが密にやり取りするのは汎用性を失うので良くないです。
上位にマネージャを配する形にするとオブジェクトの独立性と関係性のバランスを取りやすくなります。

少し前にこの掲示板で、ゲームのマップとキャラ(自キャラ,敵キャラ,アイテム,トラップ)の関係という内容のやりとりもありました。

Re: [C#]コントロール間の連携

Posted: 2013年8月30日(金) 12:00
by YuO
個人的には,
  1. TreeViewのノードをダブルクリック
  2. TreeView.DoubleClickのイベントハンドラで,GetNodeAtを元にTreeNodeを取得
  3. TreeNodeからModelのオブジェクトを取得 (Tagあたりとか,継承を使うとかする)
  4. 取得したオブジェクトが,「『開いているファイル』オブジェクトのリスト」を管理するオブジェクトにファイルを開くように要求 (=メソッド呼び出し)
  5. 管理オブジェクトが,「開いているファイル」オブジェクトを作成し,リストに追加し,変更イベント (INotifyCollectionChanged.CollectionChangedあたりが適切か) を発生
  6. 変更イベントを監視していたコントロール (フォームでもタブコントロールでも可) が,変更イベントを検知して,タブを修正する
という流れにしますね。
プレゼンテーションロジックが複雑だったり表示時にModelの値の変換が入るならModelとViewの間にViewModel的な物を用意しますが。

アプリケーションが小さいならModelを作らないというのもありですが,大きくなったら「関心事の分離」に従ってViewとModelを分けて (PDS = Presentation-Domain Separation),上記のような作りになっていきます。
# 今回の話では,Model内部までは立ち入っていません。


Viewについては,管理に適した単位程度にまとめる方がよいです。
既存のコントロールの動作に手を入れるならともかく,そうでないなら既存のコントロールを継承したクラスを作る必要はありません。
論理的にまとまった単位や,繰り返される単位でUserControlに切り出すのが,個人的には使いやすい方法だと思います。
# 今回だと,タブの各ページの中身をUserControl化してしまう。

Re: [C#]コントロール間の連携

Posted: 2013年9月03日(火) 17:24
by オカピーα
無事、解決できました!
モデルパターンのお話は非常に深く、興味深いです。
これが片付いたら取り組んでみます。
みなさんありがとうございました!