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

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

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

Re[4]: RowEnter イベントにおいてインデックス取得時にエラー


(過去ログ 27 を表示中)

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

■12739 / inTopicNo.1)  RowEnter イベントにおいてインデックス取得時にエラー
  
□投稿者/ OGAKUZU (7回)-(2008/01/16(Wed) 10:39:02)

分類:[C#] 

環境:Visual Studio 2005 Standard

DataGridView において、行がフォーカスを取得したときの処理を書きたいのですが
RowEnter イベントを用いてカレント行のインデックスを取得しようとすると実行時に
エラーが起きます。

private void dataGridViewD_RowEnter(object sender, DataGridViewCellEventArgs e)
{
  // カレント行を得る
  int index = dataGridViewD.CurrentCell.RowIndex; ← エラー

  // 以下、カレント行の処理
}

エラーメッセージ
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

RowEnter イベントの代わりに CellEnter イベントで試すと、このエラーは起きません。

こちらの環境ではディスク容量不足のため Visual Studio 2005 SP1 をインストール
できていないのですが、インストールされている環境でも同じエラーが起きるのでしょうか?

どなたか教えてください。


引用返信 編集キー/
■12740 / inTopicNo.2)  Re[1]: RowEnter イベントにおいてインデックス取得時にエラー
□投稿者/ 魔界の仮面弁士 (569回)-(2008/01/16(Wed) 10:46:33)
No12739 (OGAKUZU さん) に返信
> private void dataGridViewD_RowEnter(object sender, DataGridViewCellEventArgs e)

引数 e の RowIndex は使えないでしょうか?


>   int index = dataGridViewD.CurrentCell.RowIndex; ← エラー
> 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

NullReferenceException の事でしょうか。

エラーが出るとの事ですが、具体的には、上記のコードに対して
 (1)『dataGridViewD が null である』
 (2)『dataGridViewD.CurrentCell が null である』
 (3)『どちらも null では無いが、そのエラーが発生している』
のいずれの状態になっているのでしょうか?

引用返信 編集キー/
■12741 / inTopicNo.3)  Re[2]: RowEnter イベントにおいてインデックス取得時にエラー
□投稿者/ OGAKUZU (9回)-(2008/01/16(Wed) 11:29:37)
> 引数 e の RowIndex は使えないでしょうか?

引数 e の RowIndex を使ったところ、エラーが解消され予定通りの動作をしました。
ご指導ありがとうございました。

その他ご質問くださった件については、次の通りです。

>>  int index = dataGridViewD.CurrentCell.RowIndex; ← エラー
>>「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
>
> NullReferenceException の事でしょうか。

NullReferenceException の事だと思います。
(「NullReferenceException は、ユーザコードによってハンドルされませんでした」
という表示が一緒に出ておりました)

> エラーが出るとの事ですが、具体的には、上記のコードに対して
>  (1)『dataGridViewD が null である』
>  (2)『dataGridViewD.CurrentCell が null である』
>  (3)『どちらも null では無いが、そのエラーが発生している』
> のいずれの状態になっているのでしょうか?

(3) の状態だと思います。
RowEnter 内で下記コードを実行したところ3行目で同じエラーが起きました。

Debug.Print("{0}", dataGridViewD);
Debug.Print("{0}", dataGridViewD.CurrentCell);
Debug.Print("{0}", dataGridViewD.CurrentCell.RowIndex); ← エラー

魔界の仮面弁士さん、お世話になりました。

解決済み
引用返信 編集キー/
■12742 / inTopicNo.4)  Re[3]: RowEnter イベントにおいてインデックス取得時にエラー
□投稿者/ 魔界の仮面弁士 (570回)-(2008/01/16(Wed) 14:00:46)
No12741 (OGAKUZU さん) に返信
> (3) の状態だと思います。
> RowEnter 内で下記コードを実行したところ3行目で同じエラーが起きました。

3 行目ということは、(3) ではなく、(2) の状態だと思いますよ。

1 行目を実行した時には "System.Windows.Forms.DataGridView"、
2 行目を実行した時には "" と出力されているのでは無いでしょうか?

たとえば、
 Debug.Print("{0}", dataGridViewD == null);
 Debug.Print("{0}", dataGridViewD.CurrentCell == null);
を実行してみてください。
先のエラーが発生するタイミングでは、前者は False 、後者は True になっているかと思います。


> 引数 e の RowIndex を使ったところ、エラーが解消され予定通りの動作をしました。

今回の場合は、e.RowIndex を使うのが正解という事になりますが、それは
RowEnter イベントの時点では、CurrentCell の内容はまだ、書き変わっていないからです。

そもそも、表示した直後は、どのセルもアクティブになっていませんから、
dataGridViewD.CurrentCell は空っぽ(すなわち null)を返してしまい、
dataGridViewD.CurrentCell.RowIndex がエラーになっていたのでしょう。


なお、今回の場合は関係ありませんが、知りたいのが現在のセルの行番号や列番号 だけ である場合は、
DataGridView.CurrentCell プロパティを利用するのは、避けた方が良いかと思います。その場合は、
DataGridView.CurrentCellAddress プロパティを利用することを検討してみてください。


http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.currentcelladdress%28VS.80%29.aspx
≫ セルに直接アクセスせずに現在のセルの行および列を確認するには、
≫ このプロパティ(CurrentCellAddress)を使用します。
≫ これは、共有行が非共有にならないようにする場合に便利です。

http://msdn2.microsoft.com/ja-jp/library/ha5xt0d9.aspx
≫ パフォーマンスへの影響を回避するには、行が非共有にならないようにする必要があります。
(中略)
≫ 行が非共有にならないようにするには、次のガイドラインに従います。
(中略)
≫ CurrentCellAddress プロパティを使用すると、セルに直接アクセスすることなく、
≫ 現在のセルの行と列のインデックスを取得できます。
解決済み
引用返信 編集キー/
■12744 / inTopicNo.5)  Re[4]: RowEnter イベントにおいてインデックス取得時にエラー
□投稿者/ OGAKUZU (10回)-(2008/01/16(Wed) 15:35:26)
> 1 行目を実行した時には "System.Windows.Forms.DataGridView"、
> 2 行目を実行した時には "" と出力されているのでは無いでしょうか?

はい、上記の通り出力されました。

>  Debug.Print("{0}", dataGridViewD == null);
>  Debug.Print("{0}", dataGridViewD.CurrentCell == null);

試したところ、1行目が False、2行目が True でした。
したがいまして、おっしゃるように null ポインタのメンバへのアクセスが今回の
原因だったようです。

「CurrentCellAddress」と「共有行」についての情報提供をありがとうございました。
msdn の内容を理解するのに少々時間がかかりそうですが、今後機会があれば活用してみます。

魔界の仮面弁士さん
大変お世話になりまして、ありがとうございました。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -