- - PR -
オブジェクト参照がオブジェクト インスタンスに設定されていません。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-07 14:41
はじめまして、高中と申します。現在、.NET及びC#にてwebアプリケーションを開発中の者です。
データグリッド内のプッシュボタンをクリックすると,"オブジェクト参照がオブジェクト インスタンスに設定されていません",というエラーメッセージが出力されて処理が中断してしまいます。 以下がそのソースです。 namespace test3 { /// <summary> /// WebForm1 の概要の説明です。 /// </summary> public class WebForm1 : System.Web.UI.Page { protected System.Data.DataSet dataSet1; protected System.Data.DataSet EntryEria; private void Page_Load(object sender, System.EventArgs e) { // ページを初期化するユーザー コードをここに挿入します。 if (!IsPostBack) { // マスタを読み込む oracleDataAdapter1.Fill(dataSet1); する OriginalData = dataSet1.Copy(); EntryEria = dataSet1.Clone(); EntryEria.Tables[0].Rows.InsertAt(EntryEria.Tables[0].NewRow(), 0); // 更新用,登録用データセットをバインドする DataGrid1.DataSource=EntryEria; DataGrid1.DataBind(); DataGrid2.DataSource=dataSet1; DataGrid2.DataBind(); Session["x"] = dataSet1; Session["z"] = EntryEria; } } public void DataGrid2_ItemCommand(object sender, DataGridCommandEventArgs e) { dataSet1.Merge((DataSet)Session["x"]); EntryEria.Merge((DataSet)Session["z"]); <-- この行でエラー if (e.CommandName == "Delete") { // 処理が入る } } } } 同じようにsession変数にセットし、同じようにマージしているにもかかわらず、 dataSet1.Merge((DataSet)Session["x"]); はエラーにならず、 EntryEria.Merge((DataSet)Session["z"]); はエラーになります。 初歩的な事だと思うのですが昨日はまる一日この件で仕事になりませんでした。 どなたか原因をご存知の方は教えていただけないでしょうか? | ||||
|
投稿日時: 2005-12-07 14:54
こんにちは。
何が null になっているのかデバッガできっちり確認されましたか? DataSet.Clone() のヘルプをしっかり読んでみて下さい。今回の例外の原因が書かれています。 _________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2005-12-07 18:17
囚人さん、ありがとうございました。デバッガで確認したところ、EntryEriaが未定義となっていました。DataSet.Clone()を再度実行すると、とりあえずエラーで落ちることはなくなりました。(原因に関してはまだ理解できていません)
現在私は周りにC#の経験者がおらず、MSDNも手に入らないという環境で開発を行っています。(私は一週間前に.NET及びC#を始めたばかりで、WEBアプリケーションもオブジェクト指向プログラムの経験もありません) 今後ともよろしくお願いします。 | ||||
|
投稿日時: 2005-12-07 18:41
なるほど。失礼しました。
とりあえず http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/netstart/html/cpframeworkref_start.asp で、リファレンスは参照できます。 一応 DataSet.Clone() はこちらです。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatadatasetclassclonetopic.asp デバッガは使える環境みたいですが、開発は何を使っていますか? 現状は本を読みながらの学習といったところでしょうか? 今回の件の結論を言いますと、Clone() はデータまでコピーされないって事です。 それでは、一緒に頑張っていきましょう。 _________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2005-12-07 20:29
囚人さん、ご親切にどうもありがとうございます。
DataSet.Clone()がスキーマ等のコピーでデータそのものをコピーしないというのは理解できるのですが、私はClone()を実行した後、 EntryEria.Tables[0].Rows.InsertAt(EntryEria.Tables[0].NewRow(), 0); として空白の行を一行挿入しています。このDataSetをセッション変数に保存しているのでマージすれば元通りになると考えているのですが、うまくいきませんでした(ココがわからないんです). やりたいことは、このコピー元、コピー先二つのDataSetを共にバインドして、読み込んだデータを表示するグリッドと、空白行を一行だけ表示する登録用のグリットを表示してオペレータからキー入力された値をコピー元のDataSetに追加し,コピー元のグリッドを再バインドすればすれば追加行がコピー元のグリッドに再表示される、といった処理です。 ちなみに開発環境はWindows 2003 Saver ツールはVisual Studio.NETを使っています。 | ||||
|
投稿日時: 2005-12-08 00:59
おーそっかそっか。すみません。見当違いのことを言ったみたいですね。
これのインスタンスはどこで作ってるんですかね? DataSet を画面に貼るってあったんでしたっけ?(現在環境がなくて試せません) インスタンスを作らないと、メソッドを呼ぶなんてできないので、 EntryEria.Merge() ができないという事かな。 dataSet1 はどこでインスタンスを作っていますか? _________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2005-12-08 14:41
インスタンスは明示的に生成していません。私の考えでは
oracleDataAdapter1.Fill(dataSet1); とした時点と EntryEria = dataSet1.Clone(); として時点で生成されていると思うのですが間違っていますか? 事実、このdataSet1をグリッドにセットしてバインドするとデータベースのデータがグリッドに表示されます。 | ||||
|
投稿日時: 2005-12-08 15:20
試せました。
DataSet を画面に貼って使うという方法をした事がなかったので、確認が遅れました。すみません。 dataSet1 は画面に貼っていますね? InitializeComponent() でインスタンスが作られているようです。 oracleDataAdapter1.Fill() を行うときも、Fill() する前にインスタンスを作らなければなりません。 dataSet1.Clone(); で新しいインスタンスが作られるというは正解です。 しかしそれは、初回リクエスト時にしか行っていませんね。 つまり public void DataGrid2_ItemCommand では、EntryEria のインスタンスが作られていないのでしょう。 しかし、EntryEria もたぶん画面に貼っているので、インスタンスは作られているかもしれません。 しかし、その場合でもただインスタンスが作られただけの状態(Clone()されていないのでスキーマがない)なので、 Merge() ができない状況なのではないでしょうか。 _________________ 囚人のジレンマな日々 |