こんにちは、初めてこちらの掲示板を利用させて頂きます。
VBの勉強を始めることになり、コードを書いていたのですが、
早速つまづいてしまいました。
参考書やネットなどで自分なりに解決先を探してみたのですが、
これといった原因が見つからなかったため質問させて頂きます。
初心的な内容になりますが、何が原因でどの様にすればよいのか
お力添え頂けると幸いです。
【 環境 】
OS:Windows XP
開発環境:Visual Web Developer 2008 Express Edition
開発言語:VB
【 やりたいこと 】
操作画面に配置したコントロールの表示をクラスを使って変更したい
(Label1.textプロパティの表示)
【 状況 】
①操作画面上にコントロールを配置(Label1、Button1、Button2)
②Label1.textに情報を格納
③①にて自動作成されるクラス(以後「旧クラス」)とは別にクラス(以後「新クラス」)を作成
④③にて作成した新クラスに旧クラスを継承し、メソッドを定義
メソッド内容:新クラスに引数をもたせ、引数をLabel1.textプロパティに格納する
⑤旧クラスにてButton1、Button2のクリックイベントプロシージャでLabel1.textプロパティに
変更を加えた値を引数にして新クラスで作成したメソッドを呼び出す
⑥⑤までの内容にて作成したコードのデバッグを実行すると、Button1、Button2のクリック時に
エラーが発生
・エラーメッセージ
「NullReferenceExceptionはユーザーコードによってハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。」
・エラー箇所
新クラスにてLabel1.textプロパティを設定したところ
【 コード内容 】
Public Class _Default
Inherits System.Web.UI.Page
'操作画面表示時にLabel.textプロパティに情報を格納
Public Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Label1.Text = Month(Now)
End Sub
'Button1クリック時にクラスhyoziのメソッドhzを呼び出す
Public Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim s As Integer
Dim zi As New hyozi
s = Label1.Text - 1
zi.hz(s)
End Sub
'Button2クリック時にクラスhyoziのメソッドhzを呼び出す
Public Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim r As Integer
Dim zi2 As New hyozi
r = Label1.Text + 1
zi2.hz(r)
End Sub
End Class
Public Class hyozi
'クラス_Defaultを継承
Inherits _Default
'メソッドの定義
'(メソッド内容:クラス_Defaultのクリックイベントにて引数を引き継ぎ、その引数内容でLabel1.textプロパティを変更)
Public Sub hz(ByVal t As Integer)
'Dim z As New _Default
Label1.Text = t '← ここでエラーになります
'MsgBox(Label1.Text)
End Sub
End Class
Label1 は Class _Default 上に配置したコントロールですよね。
Public Class hyozi の中で記述の
Label1.Text = t ...Class hyozi上に配置したコントロールでは無いですよね?
自クラスの中のコントロールで無い場合には
どのクラスのコントロールかを指定する必要があるかと。
hyozi.Label1.Text = t として見て下さい。
回答ありがとうございます。
Label1はClass _Default上に配置したコントロールになります。
(Class hyozi上にはコントロールは何も配置しておりません。)
Class _Default上に配置したコントロールの指定を行いたいので
「hyozi.Label1.Text = t」ではなく「_Default.Label1.Text」になりませんか?
ただ、
「hyozi.Label1.Text = t」とするとビルドエラーになり
エラーメッセージ
「非共有メンバを参照するには、オブジェクト参照が必要です。」
となり、
「_Default.Label1.Text」としても同様にエラーになり
エラーメッセージ
「'_Default.Protected.WithEvents.Label1 As System.Web.UIWebControls.Label'は'Protected'であるため、
このコンテキストではアクセスできません。」
となります。
アクセス修飾子がPrivateだからいけないというのは他クラスからのアクセスだからなのだと
イメージがつくのですが、Label1の定義は自動のため、今は定義箇所を探しているところです。
それともやろうとしていることがそもそも間違っていたりするのでしょうか?
VWDを利用しての開発が初めてになるため、とりあえず色々試しているところです。
もしまたなにかアドバイスを頂けると幸いです。
稚拙な内容になりますがよろしくお願いします。
hyoziクラスはなんのために用意されているのですか。
Pageクラスを継承したクラスを1から書いてベースクラスにする事はしますが,
.aspxと対応の付いたページのコードクラスを継承する事は通常しません。
失礼、書き間違えたようですが
「_Default.Label1.Text」としても同様にエラーになり...なら
原因、解決策は他ですね。
ご意見ありがとうございます。
YuOさん
hyoziクラスは_Defaultクラスにて配置した多数のコントロールの表示や設定内容を
まとめたもので、_Defaultクラスから呼び出して関数の様に利用しようと考えています。
最初は「Class.vb」ファイルの様にクラスファイルとして作成して利用しようかと考えても
みたのですが、問題ないのであればとりあえず、ということで_Defaultクラスと並べて作成していました。
aspxページのコードクラスを継承するということは通常はしないのですね。
それではやはりクラスファイルとして作成することになるのですね。
勉強になります。
9月さん
いえいえ、ご意見ありがとうございます。
とりあえず試行錯誤しながら原因、解決策を模索中です。
解明できましたらまたここで報告させて頂きますね。
クラスのインスタンスについての理解が不足しているように思えますが……。
例えば,_Defaultクラスに
Protected _val As Integer
という宣言を追加した場合,
・Default.aspx + Default.aspx.vbによって作られるインスタンスに含まれるval
・Default.aspx.vbの中でNewされたhyozi型のインスタンスに含まれるval
は別の物になります。
で,コントロールが多数になるのであれば,ユーザーコントロールで分類分けしてしまうのも手でしょう。
現在の状況ではページにすべてが集中しているのでしょうから。
ご意見ありがとうございます。
入門書とネットにて勉強してみたのですが、やはりまだ理解不足でしたね・・・
インスタンスを含め、もう一度復習し直すことにします。
確かにページに集中させてはクラスの有効活用もできないですしね。
勉強し直してYuOさんの意見がきちんと理解できる様になり、
またどうしても聞きたいことがあればまた質問させて頂くことにします。
しりつぼみで申し訳ありませんが、本件は解決済みとさせて頂きます。
ご意見を下さった方々、ありがとうございます。