C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: UserControl内のコードで親のコントロールにアクセス


(過去ログ 69 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■40444 / inTopicNo.1)  UserControl内のコードで親のコントロールにアクセス
  
□投稿者/ Ree@ (1回)-(2009/08/26(Wed) 11:03:35)

分類:[VB.NET/VB2005 以降] 

UserControlのLoadイベントで親のコントロールにアクセスする事は可能でしょうか?

現在UserControlからParentを使って親フォームのコントロールは取得出来て
Textプロパティ等の変更は可能です。

ただ、既に実装されているイベントや自分で用意したプロパティやイベントが
使えなくて困っています。

自分の中のイメージとしては○○というイベントやメソッドがフォームにある事を前提として
処理を書くと思うのですが、書き方がわかりません。

以上です、よろしくお願いします。
引用返信 編集キー/
■40445 / inTopicNo.2)  Re[1]: UserControl内のコードで親のコントロールにアクセス
□投稿者/ よねKEN (410回)-(2009/08/26(Wed) 11:14:25)
No40444 (Ree@ さん) に返信
> UserControlのLoadイベントで親のコントロールにアクセスする事は可能でしょうか?

ご自身で書かれている通りParentプロパティを通じてアクセスすることはできます。

> 現在UserControlからParentを使って親フォームのコントロールは取得出来て
> Textプロパティ等の変更は可能です。

その通りですね。ParentプロパティはControl型を返すので、
Controlクラスに定義されているものであればどれでも簡単にアクセスできます。

> ただ、既に実装されているイベントや自分で用意したプロパティやイベントが
> 使えなくて困っています。

UserControlを配置する先の親コントロールを使ったイベントや独自に用意したプロパティやイベントは
Controlクラスのものではないので、そのままではアクセスできませんね。
親コントロールが何クラスなのかわかっているのであれば、そのクラスにキャストすることで
アクセスできないことはありません・・・・が、そういうことは普通しません。

> 自分の中のイメージとしては○○というイベントやメソッドがフォームにある事を前提として
> 処理を書くと思うのですが、書き方がわかりません。

そういう前提でUserControlを作ろうとしていることが間違いです。
UserControlがその配置先の画面構成に依存してしまうため、
流用しづらい部品となり、UserControlにする意味が薄れてしまいます。

引用返信 編集キー/
■40480 / inTopicNo.3)  Re[2]: UserControl内のコードで親のコントロールにアクセス
□投稿者/ やじゅ (1266回)-(2009/08/26(Wed) 20:12:07)
やじゅ さんの Web サイト
> ■No40444 (Ree@ さん) に返信
>自分の中のイメージとしては○○というイベントやメソッドがフォームにある事を前提として
>処理を書くと思うのですが、書き方がわかりません。

親コントロールのイベントやプロパティを使うものを、インターフェイスとして定義
親コントロール側にも上述インターフェイスを実装

UserControlは汎用的に使える部品として作成、そのUserControlを継承したクラスを作成し、その時に上述のインターフェイスを実装する
そして、画面には継承したクラスを使う。

って方法を私は使ったんですけど、どうなんでしょう・・・

例
Public Interface IFWForm
 Event Hoge(ByVal sender As Object)
 Sub SetHoge()
 Property Fuga As Boolean
End Interface

Public Class FormEx
   Implements IFWForm
 Sub SetHoge()
    xxxxxx
  End Sub
End Class

Public Class EditBoxEx
    Implements IFWForm
    Private _frmBase As Form
    Protected Overridable Sub EditBoxEx_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter
        _frmBase = Me.TopLevelControl        'このコントロールが配置されたフォームへの参照を保持
        CType(_frmBase , IFWForm).SetHoge()  'フォームのメソッドを実行  
    End Sub
End Class

引用返信 編集キー/
■40483 / inTopicNo.4)  Re[3]: UserControl内のコードで親のコントロールにアクセス
□投稿者/ まどか (622回)-(2009/08/26(Wed) 20:47:35)
考え方は置いといて。。。

No40480 (やじゅ さん) に返信
> Public Class EditBoxEx
> Implements IFWForm

なぜ、ユーザーコントロールがこのインターフェースを「実装」しなければいけないのかがわかりません。


> Ree@さん

よねKENさんも書かれていますが、「依存性を一方向にする」という考え方に反するということです。
ユーザーコントロールはどのコントロールに貼り付けられるかわかりません。
親がわからないのに「〜があるはずだ」という前提(依存)を作ることはその考え方に反しているということがお分かりになると思います。

たしかにParentなど逆方向を参照するプロパティがあるということは使用できるということです。
しかし実装するとなると、前提を満たさない親の場合に(デザイン時に)例外を発生させたり、
すべての処理が動かないようにガード句を入れたりと大変になることは間違いありません。

依存性を一方向にするとは、今の仕様の考え方を逆転することですが、たとえば次のようなことになります。

たとえばユーザーコントロールのテキストに変更があったら親フォームのテキストの内容をその場で書き換えるとします。
1.ユーザーコントロールにテキストが変更になった旨の独自イベントを実装し、テキストのTextChangedイベントでその独自イベントを発生させます。
2.親フォームはユーザーコントロールの独自イベントをハンドルして自身のテキストを書き換えます。

ユーザーコントロールは「テキストが変わったらイベント起してやるから拾いたきゃ勝手に拾え」になり
親が誰であるかを全く意識(依存)していないことがポイントです。
引用返信 編集キー/
■40541 / inTopicNo.5)  Re[4]: UserControl内のコードで親のコントロールにアクセス
□投稿者/ Ree@ (3回)-(2009/08/27(Thu) 18:29:07)
・W勤&#63731;P局_^テフフフフフ・V虞ミLワ&#63731;&#63731;畿貴&#58920;H貴・H起D・羽・畿・
・機8PEt&#57418;8QEu・^テフフフフフ・飢・t・・3ノ9Qw
S・・&#63731;Y貴&#57418;Q隠・隠・・;Gu愚・&#128;{
s孔&#63728;SS庚クQ庚&#128;QP鞨~

>例
>Public Interface IFWForm
> Event Hoge(ByVal sender As Object)
> Sub SetHoge()
> Property Fuga As Boolean
>End Interface
>
>Public Class FormEx
>   Implements IFWForm
> Sub SetHoge()
>    xxxxxx
>  End Sub
>End Class
>
>Public Class EditBoxEx
>    Implements IFWForm
>    Private _frmBase As Form
>    Protected Overridable Sub EditBoxEx_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter
>        _frmBase = Me.TopLevelControl        '庚ヤ・ネ&#63731;&#63731;庚ク・ネ&#63731;&#63731;ニE・9^lt&j&#63731;S孝XP庚ヤ鎹ヒ&#63731;
>        CType(_frmBase , IFWForm).SetHoge()  's孔&#63728;SS庚クQ庚&#128;QP鞨~  
>    End Sub
>End Class
マSWW勤關・&#63731;祈@ィu*ィ凝u局SPW勤陝・&#63731;祈 ・
テY貴・D<F・rミ_^[ノツマ
孝APPW勤霰ワ&#63731;&#63731;畿貴&#58920;H貴・H起D・羽・畿・
ク@

引用返信 編集キー/
■40544 / inTopicNo.6)  Re[5]: UserControl内のコードで親のコントロールにアクセス
□投稿者/ やじゅ (1279回)-(2009/08/27(Thu) 20:59:35)
やじゅ さんの Web サイト
No40541 (Ree@ さん) に返信

文字化けらったで、解析不能
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -