C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: NullReferenceException


(過去ログ 110 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■65176 / inTopicNo.1)  NullReferenceException
  
□投稿者/ 北村 (1回)-(2013/02/11(Mon) 12:57:51)

分類:[VB.NET/VB2005 以降] 

はじめまして、VB2008、MySQL、Vistaで住所録のようなソフトを作成しています。

フォームにコンボボックスを配置し、ウイザードにて都道府県テーブルの内容を選択できるようにしています。
都道府県を選択するとDataGridViewのレコードが都道府県別に抽出されます。

しかし、実行するとコンボボックスにテーブルデータの1行目である北海道の表示が出たため、フォームのLoadイベントに
  Me.ComboBox1.SelectedIndex = -1  として空白行を表示するようにしました。

その後実行すると、「NullReferenceExceptionがハンドルされませんでした」と表示され動作しません。
空白行が欲しくて追加したコードが原因とわかるのですが、どのようにすれば良いのでしょうか。
現在のコードは下記のようになっています。

 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        '都道府県での絞り込み処理
        Dim Table As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
        Dim View As DataView = Table.DefaultView
        View.RowFilter = "住所 Like '*" & ComboBox1.Text & "*'"
        DataGridView1.Sort(DataGridView1.Columns(3), System.ComponentModel.ListSortDirection.Ascending)
    End Sub

どうぞよろしくお願いします。

引用返信 編集キー/
■65177 / inTopicNo.2)  Re[1]: NullReferenceException
□投稿者/ Azulean (95回)-(2013/02/11(Mon) 13:24:24)
2013/02/11(Mon) 13:25:13 編集(投稿者)

No65176 (北村 さん) に返信
> その後実行すると、「NullReferenceExceptionがハンドルされませんでした」と表示され動作しません。
> 空白行が欲しくて追加したコードが原因とわかるのですが、どのようにすれば良いのでしょうか。
> 現在のコードは下記のようになっています。

その NullReferenceException はどこで発生しているか確かめましたか?
デバッグで止まった地点、あるいは例外から StackTrace プロパティを確認するなど、どこのメソッドで発生したかをまずは確認してください。
また、デバッグで止まった場合、変数やプロパティにカーソルを合わせるとその中身を確認できるので、Nothing となっているものがないか、併せて確認してください。

それは ComboBox1_SelectedIndexChanged で間違いないのでしょうか?
また、SelectedIndex = -1 と書いたのはどこのどのタイミングでしょうか?データテーブルの初期化、DataGridView1.DataSource への設定などは終わっている状態でしょうか?


> しかし、実行するとコンボボックスにテーブルデータの1行目である北海道の表示が出たため、フォームのLoadイベントに
>   Me.ComboBox1.SelectedIndex = -1  として空白行を表示するようにしました。

個人的には「すべての都道府県」(あるいは単に「すべて」)という選択項目を作るべきではないかと思いました。
仮に起動時は空白だったとしても、その後どれかの都道府県を選ぶと、二度と全都道府県を表示できませんので、使い勝手に問題がないのかを気にしました。
引用返信 編集キー/
■65178 / inTopicNo.3)  Re[2]: NullReferenceException
□投稿者/ 北村 (2回)-(2013/02/11(Mon) 14:25:54)
No65177 (Azulean さん) に返信
すみません、プログラムを始めて間がないので指摘されている事項に対して外しているかも知れません。

実行して止まる箇所はComboBox1_SelectedIndexChanged イベント内の
  View As DataView = Table.DefaultView  という記述に黄色のハイライトがついています。
 
StackTraceプロパティは確認方法がわかりません。

コード欄の下にある自動変数というウインドウにはNothing となっているものが3つあります。
DataGridView1.DataSource と、Tableと、Viewです。


また、SelectedIndex = -1 と書いたのはウイザードで作られたコードの直後で具体的には下記のようになります。

Public Class Search
    Private Sub Search_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'データを 'TESTDataSet.都道府県' テーブルに読込
        Me.都道府県TableAdapter.Fill(Me.TESTDataSet.都道府県)
        Me.ComboBox1.SelectedIndex = -1


>データテーブルの初期化、ComboBox1_SelectedIndexChanged への設定などは終わっている状態でしょうか?
これもよくわからないのですが、Me.ComboBox1.SelectedIndex = -1 の行をコメント文にすると都道府県別の絞り込みが出来ています。


「すべて」の選択項目についてですが、フォームのどこかに「クリア」のボタンを設けて、押下時にフォームロード時に戻す事を考えています。
その部分は未だ記述していないので上手く行くか不明です。

このような回答でよろしいでしょうか。
よろしくお願いします。

引用返信 編集キー/
■65180 / inTopicNo.4)  Re[3]: NullReferenceException
□投稿者/ 魔界の仮面弁士 (155回)-(2013/02/11(Mon) 15:33:19)
No65178 (北村 さん) に返信
> 実行して止まる箇所はComboBox1_SelectedIndexChanged イベント内の
>   View As DataView = Table.DefaultView  という記述に黄色のハイライトがついています。
> コード欄の下にある自動変数というウインドウにはNothing となっているものが3つあります。
> DataGridView1.DataSource と、Tableと、Viewです。

「Table」という変数が Nothing になっているのですよね。

まだ生成されていないオブジェクトの DefaultView プロパティを参照しようとしたため、
エラーになっているという事です。


宣言された変数 Table に対して、実際にオブジェクトを割り当てているのは
どの箇所でしょうか? それが終わってからでないと、Table.DefaultView は呼び出せません。


> Me.都道府県TableAdapter.Fill(Me.TESTDataSet.都道府県)
> Me.ComboBox1.SelectedIndex = -1
このとき、Me.ComboBox1.DataSource は、次のうちどれになっていますか?

 (1) Nothing
 (2) BindingSource オブジェクト
 (3) Me.TESTDataSet のデータセット オブジェクト
 (4) Me.TESTDataSet.都道府県 のデータテーブル オブジェクト
 (5) ComboBox1_SelectedIndexChanged で使おうとした Table 変数のオブジェクト
 (6) 上記のいずれでもない
 (7) DataSource に何をセットしてあるのか、そもそも仕組みを理解できていない
引用返信 編集キー/
■65181 / inTopicNo.5)  Re[4]: NullReferenceException
□投稿者/ 北村 (3回)-(2013/02/11(Mon) 16:03:15)
No65180 (魔界の仮面弁士 さん) に返信
(7)です。

恐縮ではございますが、教えて頂けませんでしょうか?
よろしくお願いいたします。

引用返信 編集キー/
■65195 / inTopicNo.6)  Re[5]: NullReferenceException
□投稿者/ PATIO (1回)-(2013/02/12(Tue) 14:50:46)
No65181 (北村 さん) に返信
> ■No65180 (魔界の仮面弁士 さん) に返信
> (7)です。
>
> 恐縮ではございますが、教えて頂けませんでしょうか?
> よろしくお願いいたします。

うーん。
何かプログラムの教本みたいなものを見ながら勉強されているのか。
それとも既にあるプログラムを弄っているだけで特に参考になる本を
参照しているわけではないのか。どっちなんでしょう?
もし本を見て勉強されているなら各行で何をやっているのかが
解説されていると思うのでまずは何をやっているのか一行一行確認しながら
進めることをお勧めします。
何をやっているのかわからないコードを書いていても勉強になりませんから。

特に参考になる本をお持ちでないのなら、本を購入なりして勉強することを
お勧めします。ネットの情報は自分が求めている情報ではない場合があり、
自分がほしい情報にあっているかどうかの判断ができない内は見当違いの情報を
参考にしている事があります。
中には正確でない情報もありますから取捨選択ができないとかえって混乱しますよ。

引用返信 編集キー/
■65196 / inTopicNo.7)  Re[6]: NullReferenceException
□投稿者/ howling (187回)-(2013/02/12(Tue) 14:59:30)
No65195 (PATIO さん) に返信
うーん、本を読んで勉強すること自体には賛同します。
が、今回の話はしっかり目的のために必要な情報だと思うのですが、違いますか?

「やりたいこと」「わからないこと」「やりたいことを達成するために自分なりにやったこと」
の3つさえはっきりしていれば、ここに質問すること自体は悪くないと思いますし、
「やりたいこと」への達成の道筋が答えとなって出るものだと思っています。

ですから、今回それを問う必要性は無いんじゃないかなと…。
いかがでしょうか?


引用返信 編集キー/
■65198 / inTopicNo.8)  Re[7]: NullReferenceException
□投稿者/ PATIO (2回)-(2013/02/12(Tue) 15:28:09)
No65196 (howling さん) に返信
> ■No65195 (PATIO さん) に返信
> うーん、本を読んで勉強すること自体には賛同します。
> が、今回の話はしっかり目的のために必要な情報だと思うのですが、違いますか?
>
> 「やりたいこと」「わからないこと」「やりたいことを達成するために自分なりにやったこと」
> の3つさえはっきりしていれば、ここに質問すること自体は悪くないと思いますし、
> 「やりたいこと」への達成の道筋が答えとなって出るものだと思っています。
>
> ですから、今回それを問う必要性は無いんじゃないかなと…。
> いかがでしょうか?

質問することについては特に問題は無いと思います。
掲示板でのやり取りは時間がかかりますし、
出来ることなら手元で解決できた方がよいかなと考えました。
あと、手探り状態で進めておられる様な印象だったので
書籍のように一定の筋道と解説がある方が良いかなと思ったので書いています。
既に書籍で勉強されているなら釈迦に説法だったかもしれません。

引用返信 編集キー/
■65201 / inTopicNo.9)  Re[8]: NullReferenceException
□投稿者/ howling (188回)-(2013/02/12(Tue) 17:33:15)
No65198 (PATIO さん) に返信
手元で解決できる技量があれば最高だと思いますし、
手元で解決できる資料があるのは良いことだと思います。

ただ、実際に問題と対面した際に、
その「やりたいこと」に合った本と巡り合える機会は珍しいんじゃないのかな?と思っています。
本を探すことは良いことだと思いますが、
いざ問題に直面した時に、パッと答えてくれる物かというと、ちょっと違うかなと。

自分のすることが大きければ大きい程、書籍というのは参考になるという認識でいます。
逆に、小さな問題であればネットで調べて解決する程度で良いかなとも。
解決方法はその時々によって異なって良いと思います。

※多分、今回の質問内容からして、DataGridView関連の書籍をお読みになられながらコーディングされているとは思っていません。
 が、今回の問題を解決するために、書籍を購入してコーディングする程の事でもないと思っていますので。
 もちろん、このDataGridViewの問題を解決した後にも、DataGridViewについて触れる機会が多いとわかっているのであれば、
 書籍を薦めても良いかなと思いますが。

すみません、だいぶ脱線しました。
引用返信 編集キー/
■65203 / inTopicNo.10)  Re[5]: NullReferenceException
□投稿者/ howling (189回)-(2013/02/12(Tue) 17:39:26)
No65181 (北村 さん) に返信
さて、本題に戻りますが…。

コンボボックスで何かを表示する際には、
どのような内容を表示すれば良いのか、の一覧が必要になりますよね?
また、その内容が選択された場合に、内部的にどのような値を保持すれば良いのか、という情報も必要になります。

私はそれがDataSourceという物、という認識でいます。

これをどう紐づけるかについては、以下のURLを参考にしてみてください。

http://dobon.net/vb/dotnet/datagridview/datagridviewcomboboxcolumn.html

その上で、なんですが…。
この値の中に、-1に紐づいている都道府県名は存在しますか?
おそらくそれが存在していないために、今回「その値(-1)に紐づく物なんて無いよ、何を表示すれば良いのかわからない」
とComboBoxに怒られているんですね。
単純に-1とやってしまうのはよくあることですが、
それってプログラマーが書く「マジックナンバー」ですよね。
プログラム側はそんな事言われても理解できるはずもありません。ご注意を。
引用返信 編集キー/
■65205 / inTopicNo.11)  Re[6]: NullReferenceException
□投稿者/ 北村 (4回)-(2013/02/12(Tue) 22:22:18)
No65203 (howling さん) に返信

PATIOさん。
howling さん。
ご意見ありがとうございます。

私は、以前にAccess2003にて同様のモノを作成しました。
その時もネットで得られた情報を元に、切った、貼ったの末に完成に至りましたので
プログラムの原則というか、基礎知識は無いに等しいです。

そんなふうにして作って来ましたので書籍関連は持っていません。
書店に行って探した事はあるのですが、なかなか自分に合う書籍が無くて・・・
でも、もう一度探してみようと思います。

教えて頂いたURLも未だ理解できず、プログラムの作成も止まっている状態ですが、
一旦、解決済みにさせていただきたいと思います。

皆さん、ありがとうございました。
解決済み
引用返信 編集キー/
■65211 / inTopicNo.12)  Re[7]: NullReferenceException
□投稿者/ 北村 (5回)-(2013/02/13(Wed) 11:07:45)
Me.ComboBox1.SelectedIndex = -1

この1行、空白が欲しくて追加しましたが、
-1が、0でも1でも同じなんですね。

だから、Nothing。
たから、マジックナンバー。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -