- PR -

オブジェクト参照がオブジェクト インスタンスに設定されていません について

投稿者投稿内容
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-02 16:34
はじめまして、SLです。

ASP.NET 始めて間もないので初歩的な質問かもしれませんが、教えてください。

.Master を作成しそこに今、2つのコンテンツページを持っています。そこで
マスターページに張ったカレンダーをクリックしてその日付をコンテンツのページに表示したいのですが、”サーバー エラーが発生しました。”「オブジェクト参照がオブジェクト インスタンスに設定されていません。」となります。
発生箇所は、コンテンツページを呼び出したところでコントロールに変数を代入しようとしたところで起きています。調べた内容では、どうやらコントロールがヌルまたは参照したときオブジェクトがないと思いますが、解決策がわかりません。
どなたか教えてください。


protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
string stDate;

stDate = string.Format("{0}/{1}/{2}", Calendar1.SelectedDate.Year.ToString(), Calendar1.SelectedDate.Month.ToString(), Calendar1.SelectedDate.Day.ToString());

WebApplication1.Reservation Rev = new WebApplication1.Reservation();
Rev.Display_Text4(stDate);
}
↓呼ばれる側のページの関数
public void Display_Text4(string stDate)
{
string cloneSet = (string)stDate.Clone();

TextBox4.Text = cloneSet;  <- ここでエラーになる
}
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-05-02 17:40
WebApplication1.Reservationがコンテンツページですか?
ページのコンストラクタは通常呼び出さないでください。

示されたコードの時点ではマスターページからコンテンツページの参照は取得できないと思います。
逆にコンテンツページからマスターページの参照はMasterプロパティで取得できます。

http://msdn.microsoft.com/ja-jp/library/system.web.ui.page.master(VS.80).aspx

#すこし追記

[ メッセージ編集済み 編集者: otf 編集日時 2008-05-02 17:43 ]
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-02 22:28
お世話になります。

> WebApplication1.Reservationがコンテンツページですか?
違うのですか?まだ、本を見ながら試行錯誤中ですが、VS2005で「プロジェクト」「新しい項目の追加」のテンプレートからWebコンテンツフォームを追加し「マスタページの追加」でマスタページを追加しました。

> ページのコンストラクタは通常呼び出さないでください。
Webで検索していたらこのような参照方法があったので試しにやってみましたが、
ここでは、この方法は使えないのですね。

> マスターページからコンテンツページの参照は取得できない
ということは、コンテンツからマスタの参照は、可能ですが、その逆はできない。
という解釈でいいのでしょうか?
では、マスタ側からコンテンツページのコントロールの更新はできないのですか?
それとも一般的にこのようなプログラムはしないのですか?

まだまだ、わからないことが多くいろいろ教えてください。
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-05-02 23:30
引用:

違うのですか?まだ、本を見ながら試行錯誤中ですが、VS2005で「プロジェクト」「新しい項目の追加」のテンプレートからWebコンテンツフォームを追加し「マスタページの追加」でマスタページを追加しました。


じゃあ多分そうだと思います。

引用:

Webで検索していたらこのような参照方法があったので試しにやってみましたが、
ここでは、この方法は使えないのですね。


通常呼び出すなっていうのは過剰でした。
ここでは呼び出す必要はないと思います。

引用:

ということは、コンテンツからマスタの参照は、可能ですが、その逆はできない。
という解釈でいいのでしょうか?


はい。
まぁ参照出来ないというか参照を持っていないというのが正しいと思います。

引用:

では、マスタ側からコンテンツページのコントロールの更新はできないのですか?
それとも一般的にこのようなプログラムはしないのですか?


できます。
マスターページにCalendarのpublicプロパティを定義すればコンテンツページからアクセスできるので
当然、SelectionChangedイベントハンドラメソッドをコンテンツページで定義することもできます。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-03 00:14
お世話になります

> マスターページにCalendarのpublicプロパティを定義
ということで下記ように定義しました。
namespace WebApplication1
{
public partial class Site1 : System.Web.UI.MasterPage
{
public Calendar Cal1 = new Calendar();
public Calendar Cal2 = new Calendar();

> SelectionChangedイベントハンドラメソッドをコンテンツページで定義
さらに、コンテンツ側のページに下記のようにマスターからコピペしました。
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
TextBox4.Text = string.Format("{0}/{1}/{2}", Master.Cal1.SelectedDate.Year, Master.Cal1.SelectedDate.Month, Master.Cal1.SelectedDate.Day);
}

でも呼ばれません。どこがまずいのですか?
とりあえず、エラーは出ていません。
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-05-03 00:25
メソッドを定義するだけじゃ呼ばれません!
コンテンツページのLoadイベント時などでイベントに接続してください。

http://msdn.microsoft.com/ja-jp/library/xwbwks95(VS.80).aspx
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-03 09:46
お世話になります。

よくわからないので教えてください。
下記のようにマスタに記述し
namespace WebApplication1
{
public partial class Site1 : System.Web.UI.MasterPage
{
public Calendar Cal1 = new Calendar();
public Calendar Cal2 = new Calendar();

コンテンツ側に
protected void Page_Load(object sender, EventArgs e)
{
  Calendar Cal1 = Master.Cal1;
int ab = Cal1.SelectedDate.Day;


とすると下記のように表示され日付が取得できません。どうしたらいいでしょうか?
選択した日付が取得できません。

Master.Cal1 {SelectedDate = 名前 'SelectedData' は現在のコンテキスト内に存在しません。} System.Web.UI.WebControls.Calendar
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-05-03 10:49
マスターページの正しい参照方法は私が最初に張ったリンクに書いてありますので
よく読んでみてください。

スキルアップ/キャリアアップ(JOB@IT)