🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

3回答

676閲覧

WinFormsで、コントロールを辿って

mirainosyachiku

総合スコア4

C#

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

0グッド

1クリップ

投稿2019/10/31 10:12

前提・実現したいこと

コントロールでイベント発生時に、別のコントロールのメソッドを動かしたいです。
たとえば、以下の構造の時に、GroupBox をクリックした時に、ListBox に表示される内容を変更したいのですが、
[今のやり方]に記載した方法では、コントロールの追加、削除があった時に修正箇所があまりにも多いです。
こういう時の理想的な対処方法を教えて下さい。

Form
┣ Panel - TabControl - TabPage - Panel - UserControl - ListBox
┗ Panel - UserControl - Panel - GroupBox

今のやり方

ひたすらParentとControls[]でコントロールを辿っています。

C#

1private void groupBox1_Click(object sender, EventArgs e) 2{ 3var listBox = ((Form)gropuBox1.Parent.Parent.Parent.Parent).Controls[1].Controls[0].Controls[1].Controls[1].Controls[0] as ListBox; 4listBox.・・・・・・ 5}

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

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

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

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

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

guest

回答3

0

理想的な対処方法について

データバインディング(Data Binding)を使い、「画面のレイアウト」と「アプリケーションで取り扱うデータ」を疎結合にする(役割を分離する)ことです。

データバインディングとは、ざっくり言えば、
「データを保持するオブジェクト」と「フォーム、ウィンドウ、コントロールなどの画面、UI要素」を紐づける仕組みのことです。
もっとざっくり言えば、「モデル(データ)とビュー(画面)を紐づける仕組み」です。
※MVVMアーキテクチャにおいては、「ビューモデル(ViewModel)とビュー(View)を紐づける仕組み」です。
※以後、「モデル(Model)」と「ビュー(View)」で説明をします。

データバインディングの何が美味いかというと、

  • モデルの中身が更新されれば自動でビューも更新される
  • ビューの更新処理を自前で実装しなくてもよくなる
  • モデルとビューの関係が「1:多」でも簡単に作れる
  • ビューとモデルで役割が分かれる(疎結合になる)ため、修正箇所が分かりやすい

また、データバインディングを用いることで、フォームは下記の記述をするだけで良くなります。

  • 「どのビュー」に「どのモデルの中身」を「どんな形式」で表示するか
  • どのモデルとやり取りをするか

質問のアプリケーションを疎結合にしたらどうなるか

ひたすらParentとControls[]でコントロールを辿っています。

を行う必要が無くなります。

コントロールの追加、削除があった時に修正箇所

も非常に少なくなります。

実際に、下記のような流れで実装してください。

  1. Formの画面表示に使うモデルクラス(仮名:Model)を作成
  2. ModelFormに参照させる
  3. Modelの特定のプロパティ(仮名:Prop)とGroupBoxでデータバインディング
  4. 同様にModel.PropListBoxでデータバインディング
  5. GroupBoxのクリックイベントでModel.Propの値を更新する処理を実装する

これで、GroupBoxをクリックした時に、ListBoxに表示する内容を変更することが出来るはずです。

投稿2019/11/12 02:05

編集2019/11/12 02:31
BluOxy

総合スコア2663

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

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

0

GroupBox に ListBox の参照を変数で持っておくのではどうでしょうか。

投稿2019/11/11 13:25

nskydiving

総合スコア6500

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

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

0

ListBoxの名前で変更するのではいけませんか

投稿2019/10/31 10:16

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問