| 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 を自前で呼び出すのも避けるべきです。 イベントハンドラーを、普通のメソッドのように呼び出すことはもちろん可能ですが、 これは本来「呼びだされる物」であって、「呼び出す物」ではありませんので。 |