.NETでForm1のコントロールをクラスファイルから参照するには?

解決


さくら  2003-06-12 19:43:49  No: 107486

現在、.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


Loreley  2003-06-13 00:21:21  No: 107487

.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アプリのほうではわかりませんがご参考までに


Loreley  2003-06-13 00:22:34  No: 107488

Dim clsT As new clsTest() '*
に関しては、もとのほうが良いかもしれません。


さくら  2003-06-13 04:53:39  No: 107489

お返事ありがとうございます!

しかし、オブジェクトを引数で渡して
値を変更する方法ではなく、
フォームとは別のファイル(今回はclsTest.vbファイル)で、
フォームのコントロールを参照したいのです…。

また、何かありましたらぜひ教えてください!
よろしくお願いします。


Loreley  2003-06-13 11:05:54  No: 107490

そうですか
では一応参考までにやってるときに思った点を

いろいろと試しましたが、継承するやり方では
実際の値は変わりませんでした。
たとえば

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文の中につくり、
そこでいったんとめて変数のチェックをしてみるといいと思いますよ


さくら  2003-06-13 18:51:29  No: 107491

お返事ありがとうございます!

まだまだインスタンス(実体)とかの概念が
理解できていないので、頭がごちゃごちゃに
なっております…。

悩んだ結果、継承とかは使用せずに、
一応、要求通りの動きをさせることができましたので
そのソースを以下に載せておきます。
ありがとうございました!!

-----------------------------------------------------------------
(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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加