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

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

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

フォームをNameから取得する方法

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

■96109 / inTopicNo.1)  フォームをNameから取得する方法
  
□投稿者/ 発 (1回)-(2020/10/21(Wed) 21:59:55)

分類:[.NET 全般] 

VB.NETに関してです。

複数のフォームをもったアプリケーションを開発しているのですが、

フォーム名のString変数(例、Form1)から、そのフォームのform変数を取得したいのですが
どうすれば良いですか?


Dim fff As Form

For i = 0 To Application.OpenForms.Count - 1

Dim f As Form = Application.OpenForms(i)
If f.Name = "Form1" Then

fff = f

End If

Next


のようにして、地道に探す以外に一発で取得できる方法はございますでしょうか?



引用返信 編集キー/
■96110 / inTopicNo.2)  Re[1]: フォームをNameから取得する方法
□投稿者/ 魔界の仮面弁士 (2882回)-(2020/10/22(Thu) 01:19:28)
No96109 (発 さん) に返信
> 複数のフォームをもったアプリケーションを開発しているのですが、

Name とフォームインスタンスは、必ずしも 1 対 1 の対応になるとは限らないですよね。


暗黙のフォーム変数を用いて、すべてのフォームを
 Form2.Show()
などと書いて呼び出しているのであれば、フォームごとに固有の Name となりますが、
たとえば、
  For i = 1 To 3
    Dim f As New Form2()
    f.Show(Me)
  Next
などとすれば、"Form2" という Name のインスタンスが 3 つできますし、あるいは
  Dim f As Form = New Form1()
  f.Name = "Form2"
  f.Text = "Form3"
  f.Show()
のように、後から名前を差し替えることもできるわけで。


> フォーム名のString変数(例、Form1)から、そのフォームのform変数を取得したいのですが
> どうすれば良いですか?

ご自身で書かれているように、OpenForms から辿るか、あるいは
OpenForms 相当のインスタンス管理を自前で行うか、でしょうか。


> 地道に探す以外に一発で取得できる方法はございますでしょうか?

' 案1
Public Function GetForm(formName As String) As Form()
  Return Application.OpenForms().OfType(Of Form)().Where(Function(f) f.Name = formName).ToArray()
End Function

' 案2
Public Function GetForm(formName As String) As Form
  Return Application.OpenForms().OfType(Of Form)().FirstOrDefault(Function(f) f.Name = formName)
End Function
引用返信 編集キー/
■96117 / inTopicNo.3)  Re[2]: フォームをNameから取得する方法
□投稿者/ ぶなっぷ (254回)-(2020/10/22(Thu) 10:03:07)
Formの数が多いなら、Dictionary化がおすすめ。
Application.OpenForms()の戻り値から、毎回、検索するより高速です。

以下サンプルです。
動作確認してないので、間違っていたら失礼。

まず、以下のようにDictionaryを作成します。
 ※ 検索する可能性のあるフォームがすべてそろった時点で行うこと
 ※ その時点で1回行うだけでいいです
  Dim formDic As Dictionary(Of String, Form) = _
    Application.OpenForms().ToDictionary(Function(x) x.Name)

その後は、以下のようにして、一発で フォーム名(String) → フォーム(Form)と
検索できます。
  formDic("フォーム名")

必ず、指定したフォーム名が存在するなら、上記でOKですが、見つからないフォーム
名を検索すると例外が発生しますので、見つからない可能性がある場合は、
以下のようにしてください。
  Dim form as Form;
  formDic.TryGetValue("フォーム名", form)
この場合、見つからない場合は TryGetValue() の戻り値が False です。

引用返信 編集キー/
■96130 / inTopicNo.4)  Re[3]: フォームをNameから取得する方法
□投稿者/ 発 (2回)-(2020/10/22(Thu) 20:31:21)
No96117 (ぶなっぷ さん) に返信

ありがとうございます。

仰る通り、Dictionary化が良いのではないかと考えています。

Dim formDic As Dictionary(Of String, Form) = Application.OpenForms().ToDictionary(Function(x) x.Name)

を実行してみましたが、


エラー BC30456 'ToDictionary' は 'FormCollection' のメンバーではありません。

というエラーが発生してしまいます。

どのように修正すればよろしいでしょうか?


引用返信 編集キー/
■96132 / inTopicNo.5)  Re[4]: フォームをNameから取得する方法
□投稿者/ furu (81回)-(2020/10/22(Thu) 20:47:22)
No96130 (発 さん) に返信
> エラー BC30456 'ToDictionary' は 'FormCollection' のメンバーではありません。
LINQなので
Imports System.Linq
が必要です。
引用返信 編集キー/
■96133 / inTopicNo.6)  Re[5]: フォームをNameから取得する方法
□投稿者/ 発 (3回)-(2020/10/22(Thu) 21:15:28)
No96132 (furu さん) に返信
ありがとうございます。
Imports System.Linq

を入れてみましたが、やはり同じエラーが出てしまいます。
なぜでしょうか?

引用返信 編集キー/
■96134 / inTopicNo.7)  Re[5]: フォームをNameから取得する方法
□投稿者/ Hongliang (1102回)-(2020/10/22(Thu) 21:16:35)
FormCollectionはIEnumerable(Of Form)を実装していないので、直接ToDictionaryできませんね。
... OpenForms.Cast(Of Form)().ToDictionary ...
とCastを間に噛ます必要があります。
引用返信 編集キー/
■96135 / inTopicNo.8)  Re[6]: フォームをNameから取得する方法
□投稿者/ 発 (5回)-(2020/10/22(Thu) 21:23:54)
Hongliang さん

うまくいきました。

どうもありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ