tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 文字列によるプロパティの参照
投稿日: 2012/01/20(Fri) 10:44
投稿者魔界の仮面弁士
> ユーザーコントロールから別のフォーム上のコントロールのプロパティを
> 読みたいのですが可能ですか?
可能ですが、そもそも何故、そのような動作が必要になっているのでしょうか?


> 同一フォームならParent句で何とかなるかも
Parent 句というのは、ParentForm プロパティ(UserControl / Form 等)や
Parent プロパティ(Control / UserControl / Form 等)のことでしょうか?


> コントロールコレクションから文字列で取って来れる
Modifiers = Private や GenerateMember = False なコントロールさえにも
アクセスできてしまうため、Controls 経由での直接操作はあまりおすすめしません。

ただ、フォームにしても Application.OpenForms でフォームを列挙できますので、
そうした良し悪しを抜きにすれば、そこからアクセスすることは一応可能です。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    DataGridView1.AllowUserToAddRows = False
    DataGridView1.AllowUserToDeleteRows = False
    Dim ff As New List(Of Form)()
    For Each f As Form In Application.OpenForms
        If f IsNot Me Then
            ff.Add(f)
        End If
    Next
    DataGridView1.DataSource = ff
End Sub

Private Sub DataGridView1_RowEnter(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.RowEnter
    Dim f As Form = TryCast(DataGridView1.Rows(e.RowIndex).DataBoundItem, Form)
    If f IsNot Nothing Then
        DataGridView2.DataSource = f.Controls
    End If
End Sub

もっとも、どれが処理対象のフォームなのかを特定する必要はありますし、
コントロールによって、プロパティの読み取り方もまちまちです。なので、
せめて Controls から操作するのではなく、値を返すための Interface を
独自に用意しておき、それを Implements したフォームのみを
操作するといった、タイプセーフな仕様を決めておいた方が良いでしょう。


> そのユーザーコントロールは各フォーム上にあり、読みたいプロパティも
> そのユーザーコントロールのプロパティです。

やろうとしている事の背景が見えてこないので提案しにくいのですが、
「各フォームが値を送りつける方法」、「ユーザーコントロール側から取りに行く方法」、
「仲介となるリスナークラスを通じて通信する方法」、「リフレクションで操作」など、
作り方自体はいろいろあるとは思います。


> 何か方法はないでしょうか。
たとえば:

(案1)ユーザーコントロール側に「値要求イベント」を用意して、
  各フォームがそれに応答させる。

→各フォームは WithEvents ないしは AddHandler を通じて、相手先の
 UserControl の値要求イベントに応答するようにする。そのイベントでは
 GiveFeedback イベントや QueryContinueDrag イベントなどのように、
 EventArgs 継承クラスを通じてプロパティ値を受け渡す。
→イベントではなく、デリゲートを使うパターンもあり。


(案2)必要なデータを一か所に集約して読み書きする。

→中継先となる集約所に、各フォームが値を書き込むようにしておき、
 ユーザーコントロールはそれを読み取る。
→単純なところでは、プロジェクトのプロパティの[設定]タブに
 項目を用意して、My.Settings 経由で読み書きするなど。
→共有変数、DB、ファイル、レジストリなどを中継先とする手もあり。
 読み書きのタイミングが競合しないよう、同時実行制御を考慮しておくこと。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。