現在、.NETを使用してWEBアプリの開発をしています。
あるフォーム上(frmTest.aspx)にあるテキストボックス(txtTest.text)に、
別のクラスファイル(clsTest.vb)内から、
値を格納したいのですが、実験1、実験2ともに
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
というエラーが出て、うまくいきません。
以下にソースコードを載せますので、ご教授願います。
--------------------------------------------------------------------
(frmTest.aspx)
Public Class frmTest
Inherits System.Web.UI.Page
Protected Friend WithEvents txtTest As _ System.Web.UI.WebControls.TextBox
Private Sub btnMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMenu.Click
Dim clsT As clsTest = New clsTest()
clsT.Pub_ClsTest()
End Sub
End Class
---------------------------------------------------------------------
(clsTest.vb) 実験1
Public Class clsTest
Inherits frmTest 'frmTestを継承して派生クラスを作成
Public Sub Pub_ClsTest()
Dim strMsg As String
Try
MyBase.txtTest.Text = "あいうえお"
Catch ex As Exception
strMsg = ex.Message 'ここに入ってエラーとなる
End Try
End Sub
End Class
-------------------------------------------------------------------
(clsTest.vb) 実験2
Public Class clsTest
Inherits frmTest 'frmTestを継承して派生クラスを作成
Public Sub Pub_ClsTest()
Dim strMsg As String
Dim frmT As frmTest = New frmTest()
Try
frmT.txtTest.Text = "あいうえお"
Catch ex As Exception
strMsg = ex.Message 'ここに入ってエラーとなる
End Try
End Sub
End Class
.NETはつかってませんが、
前までのvb6までのコードで書くとすれば
(フォーム)
Public Class frmTest
Inherits System.Web.UI.Page
Protected Friend WithEvents txtTest As _ System.Web.UI.WebControls.TextBox
Private Sub btnMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMenu.Click
Dim clsT As new clsTest() '*
clsT.Pub_ClsTest(txtTest) '*テキストボックスを渡す
clsT = Nothing '*開放
End Sub
End Class
(clsTest.vb)
Public Class clsTest
'Inherits frmTest '*継承しない
Public Sub Pub_ClsTest(txt As Textbox) '*引数として受け取る
Dim strMsg As String
Try
txt.Text = "あいうえお"
Catch ex As Exception
strMsg = ex.Message
End Try
End Sub
End Class
とすれば、普通のフォームではできました。
'* のコメントがついている部分が変えた場所です
Webアプリのほうではわかりませんがご参考までに
Dim clsT As new clsTest() '*
に関しては、もとのほうが良いかもしれません。
お返事ありがとうございます!
しかし、オブジェクトを引数で渡して
値を変更する方法ではなく、
フォームとは別のファイル(今回はclsTest.vbファイル)で、
フォームのコントロールを参照したいのです…。
また、何かありましたらぜひ教えてください!
よろしくお願いします。
そうですか
では一応参考までにやってるときに思った点を
いろいろと試しましたが、継承するやり方では
実際の値は変わりませんでした。
たとえば
MyBase.txtTest.text="あああ"
strMsg=MyBase.txtText.text
としたとき、見えているfrmTest.txtTest.Textはそのままで
strMsgは"あああ"になります
なぜか。
それは継承のせいです
実行時において
目で見えているfrmTestと
clsTestのMyBaseにあたるfrmTestは
それぞれ別のfrmTestクラスのインスタンスになっているはずだからです。
ためしてませんがMyBase.show()とかやるとあたらしくフォームが出てくるんではないかと思います
Dim frmT As frmTest = New frmTest()
についても同様で
frmTは現在実行中のfrmTest(目に見えているインスタンス(実体))とは別のインスタンスで
継承もしているので、frmTestクラスのインスタンスが全部で3つあることになります
しかもこれらは全部別のものなので、見えているインスタンスには影響がないでしょう
実行時にデバッグモードでブレイクポイントをTry文の中につくり、
そこでいったんとめて変数のチェックをしてみるといいと思いますよ
お返事ありがとうございます!
まだまだインスタンス(実体)とかの概念が
理解できていないので、頭がごちゃごちゃに
なっております…。
悩んだ結果、継承とかは使用せずに、
一応、要求通りの動きをさせることができましたので
そのソースを以下に載せておきます。
ありがとうございました!!
-----------------------------------------------------------------
(frmTest.aspx)
Public Class frmTest
Protected WithEvents txtTest As System.Web.UI.WebControls.TextBox
Protected WithEvents btnMenu As System.Web.UI.WebControls.Button
Private Sub btnMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMenu.Click
Dim clsT As clsTest = New clsTest()
txtTest.Text = clsT.GetText()
End Sub
End Class
---------------------------------------------------------------------
(clsTest.vb)
Public Class clsTest
Public ReadOnly Property GetText()
Get
GetText = "あいうえお"
End Get
End Property
End Class
ツイート | ![]() |