- PR -

C#で変数に格納されているフォーム名のフォームを開くには

1
投稿者投稿内容
匿名希望
常連さん
会議室デビュー日: 2006/12/12
投稿数: 23
投稿日時: 2006-12-15 10:01
C#で質問があります

プロジェクト内に、form1、form2、form3があり
form1からform2をダイアログで開こうと思っています

form2 f=new form2();
f.ShowDialog();

とすれば普通に開くのですが

string型変数に格納(string OpenFormName="form3"されている
値を使ってフォームを開きたいのですが
どのようにすればよいのでしょうか・・・?

下記のようなswitch等を使用せず開きたいのですが・・・
出来ますでしょうか

form f;

switch(OpenFormName){
case "form2":
f=new form2();
break;
case "form3":
f=new form3();
break;
}

f.ShowDialog();

御教授宜しくお願い致します
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-15 11:05
引用:

匿名希望さんの書き込み (2006-12-15 10:01) より:

string型変数に格納(string OpenFormName="form3":wink:されている値を使ってフォームを開きたいのですがどのようにすればよいのでしょうか・・・?
下記のようなswitch等を使用せず開きたいのですが・・・


コンパイル解決が可能な、型を意識したコーディングが望ましいと思います。
Form 名を示した変数を持つこと自体が、あまり良い設計ではないと思うわけです。

どうしてもというのであれば、リフレクションについて調べてみると良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-12-15 11:25
ビルダーデザインパターン

C#にそのような機能は無かったと思うし、仮にあったとしても使用には細心の注意が必要です。外部から与えられた文字列にそってインスタンスを生成するということは、データを改竄することで任意のクラスのインスタンスを生成できるということです。そのようなコードは致命的なセキュリティホールの温床となるでしょう。

面倒でもSwitch文等を使って、生成できるインスタンスを明示的に記述するほうが望ましいでしょう。
匿名希望
常連さん
会議室デビュー日: 2006/12/12
投稿数: 23
投稿日時: 2006-12-15 12:54
リフレクションを調査し
http://dobon.net/vb/dotnet/programing/createinstancefromstring.html
を参考にして、解決しました
御教授ありがとうございました

switch等が良いかと思うのですが、
仕様上無理があるので・・・

あと、
追記質問になってしまうのですが・・・
自分自身のフルパス(カレントフォルダではなく、exe名まで)の取得方法
自分自身のnamespaceを取得する方法はありますでしょうか?

申し訳ございませんが宜しくお願い致します
minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-12-15 12:54
こんな感じでは駄目でしょうか。

コード:
            Type ftype = System.Type.GetType("WindowsApplication1.Form2");

Form frm = (Form)System.Activator.CreateInstance(ftype);
frm.Show();



--
あれ、前後しちゃったようですね。
無視してください。

[ メッセージ編集済み 編集者: minminnana 編集日時 2006-12-15 13:11 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-15 13:00
引用:

匿名希望さんの書き込み (2006-12-15 12:54) より:

あと、
追記質問になってしまうのですが・・・
自分自身のフルパス(カレントフォルダではなく、exe名まで)の取得方法
自分自身のnamespaceを取得する方法はありますでしょうか?


関連のない質問は別スレッドでお願いします。
ヒントは、System.Windows.Forms.Application クラスと System.Type クラスです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-12-15 13:00
引用:

自分自身のフルパス(カレントフォルダではなく、exe名まで)の取得方法


Application.ExecutablePath と思います。

引用:

自分自身のnamespaceを取得する方法はありますでしょうか?


その処理を書こうとしているソースコードに書いてあります。

_________________
囚人のジレンマな日々
1

スキルアップ/キャリアアップ(JOB@IT)