タイトル : 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、ファイル、レジストリなどを中継先とする手もあり。 読み書きのタイミングが競合しないよう、同時実行制御を考慮しておくこと。 |