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

わんくま同盟

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

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


■87776 / )  Re[4]: 別フォームにデータを渡したい
□投稿者/ 魔界の仮面弁士 (1725回)-(2018/06/29(Fri) 14:47:52)
a■No87765 (いまそかり さん) に返信
> <修正後ソースコード>
> 'xmlからデータを取得
> Function xmlGet(Byval a As String,Byval b As String)

Function の戻り値のデータ型が示されていません。
戻り値が無いのなら Sub にするべきですし、
戻り値があるのなら、末尾に「As String」などの記述が必要です。


> * 'ボタンクリックイベント(Form2が開く)
> * Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
> *  Dim frm As Form2
> *  frm = New Form2(df)
> *  frm.Show() '(※1)

この段階で、df の中身が Nothing になっていたりはしませんか?


> * 'Form2のオーバーロード(引数あり)
> * Public Sub New()
> *  InitializeComponent()
> * End Sub
> * 'Form2のオーバーロード(引数あり)
> * Public Sub New(df As DataSet)
> *  IntializeComponent()
> *  Me.df = df
> * End Sub

この 2 箇所の IntializeComponent() の行で、[F9]キーを押してブレークポイントを貼り、
この行で一時停止させてみてください。



(※1) からは、後者「Sub New(df As DataSet)」側の IntializeComponent が呼ばれるはずです。
後者が呼ばれた場合は、引数 df が Nothing で無いことを確認してください。
もし、引数に Nothing が渡されるとマズイ場合には、IntializeComponent を呼ぶ前に
 If df Is Nothing Then
  Throw New ArgumentNullException("df")
 End If
などを設けておくとよいでしょう。


一方、前者「Sub New()」側の IntializeComponent が呼ばれることがあるとすれば、
それは想定外の呼び出しとなります。
引数が渡されなければ、Me.df も Nothing のままになってしまうわけで。

もしも前者が呼ばれるようであれば、それがどこから呼び出されているのか
コードを見直してみてみてください。

たとえば、前者を
 Public Sub New()
のままにしただけなら、コンパイルが通る(ただし実行時エラー)のに、それを
 Private Sub New()
にしただけでコンパイルエラーになるようであれば、現在のプロジェクト設定
もしくはコーディングのどこかが間違っているのだと思います。


本来は前者を削除して、後者だけにしたいところなのですが、その場合、
特定の条件を満たしたときに、自動生成される *.designer.vb 内で、
VB のコンパイルエラー BC30109 を生じさせることがあるのが悩ましいところ。

デザイナコードでエラーが生じると、話がややこしくなるため、
No87759 では意図的に、引数なしコンストラクタを残すように案内しています。
(きちんと理解している人なら、前者を削除した状態でも正常に動作するコードを書けるはず)




> fType.InvokeMember("Form1_Load",
>          BindingFlags.NonPublic Or

他の方も書かれていますが、Reflection で解決するのは禁じ手です。
Reflection が必要となるのは、非常に限定された処理であって、
今回のケースで使うようなものではありません。


それに、Form1_Load を自前で呼び出すのも避けるべきです。
イベントハンドラーを、普通のメソッドのように呼び出すことはもちろん可能ですが、
これは本来「呼びだされる物」であって、「呼び出す物」ではありませんので。
返信 編集キー/


管理者用

- Child Tree -