- PR -

DataGridViewデータ選択時の処理を書くのに最適なイベントって?

1
投稿者投稿内容
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-09-06 14:28
いつもお世話になっております。

検索ボタン押下により
DataGridViewコントロールで一覧表示を行い、
グリッドの行を選択されたら、
該当データの詳細をテキストボックスやラベル等に表示する
・・・という処理を行っています。

グリッドのデータ表示は、検索結果をDataTableに格納し、
そのDataTableをDataSourceに設定する方法で行っています。

マウスのクリックによる選択以外にも、
キー入力で行を移動した時にも
詳細表示処理を行いたいと思っています。

そこで、SelectionChangedイベントで
詳細表示処理を書いていたのですが、
問題が出てきました。

クリアボタンを押下することで
グリッドデータやテキスト項目のクリア処理を行いたいのですが、
その際、「グリッドのクリア」は、NewしたDataTable
をDataSourceに再設定する事で行っています。


そして、そのクリア処理が実行されるたびに
SelectionChangedイベントが発生するのです・・・。

しかも、SelectionChangedが発生した時には
まだ RowCount = 0 になっていない事がわかりました。

なので、If グリッド.Rows.Count > 0 Then
という方法では詳細表示処理をとめる事が出来ず、
クリア前のCurrentCellのデータの詳細をテキストボックスに表示してしまいます。
RowValidatedイベントでも同様の現象となりました。

私が考えた苦肉の策は、Boolean型のフラグを作って、
クリア処理の前にそのフラグを立て、
詳細表示処理実行の条件に「フラグ = False Then」を追加する事だったのですが、
モジュールレベルの宣言をした変数を条件に使用するのって
思わぬバグの元って言われたりしませんか・・・? それでちょっと迷っています。

それに、この方法だと対象データが1件のときに
イベントが発生しないのです。

ヘルプを見た感じでは、
こんな処理を行いたい時に適したイベントは
見つけられませんでした。

この場合、KeyDownイベント、Clickイベントの両方から
詳細表示処理を呼ぶしかないのでしょうか。

何か良い方法はありませんでしょうか?
皆様のアドバイスをお願い致します。



KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-09-06 17:21
DataGridView のイベント絡みって、ややこしいのが多いので、
フラグ1個で回避できて上手く動いているのなら、それでいいと私なら思いますが。
フラグ使うのが嫌なら、クリア処理の前に RemoveHandler して、
処理後に AddHandler するという手はあります。

イベントに関しては、その目的で使うなら SelectionChanged よりは
RowEnter かなと思います。
やはりクリアボタンで発生しそうな気はしますが…

ちょっと本題とはそれますが、テキストボックス等の明細表示部も
バインディングを使えば、明細部に設定したり、変更を反映したりするコードを
自分で書く必要がなくなりますし、可能ならこれを使った方が間違いがないと思います。
以下の記事が参考になります。

新グリッド・コントロールの豊富な機能と高い表現力
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-09-10 12:07
KIさん、早々にお返事を下さっていたのに、
お礼が遅くなってしまい申し訳ありません。
なぜかすっかり返事をしていたつもりでした。

バインディングの件もありがとうございます。
Accessのフォームみたいに使えるって事ですよね?
勉強になりました。

グリッドのRemoveHandlerやAddHandlerの方法がわからなくて、
(メソッドはありませんよね?)
結局フラグ対応する事にしてしまいました。

KIさんに「それでいいと思う」と言っていただけて、
なんかほっとしました。ありがとうございました。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-09-10 20:01
[quote]
reikoさんの書き込み (2007-09-10 12:07) より:

グリッドのRemoveHandlerやAddHandlerの方法がわからなくて、
(メソッドはありませんよね?)
結局フラグ対応する事にしてしまいました。[/quote]

僕も上記の方法を使うと思います。

簡単ですし、折角の機会ですから、理解しておくと良いですよ。

ソリューションエクスプローラーで上記の部分に該当するフォームファイルを展開すると、FORM1.designer.*** のようなファイルが表示されると思います。
これを開いてフォームデザイナが自動生成したコードを見てみると、イベントを追加している部分が記述されている筈です。
これがまさに、AddHandler している部分です。
これが確認できれば、RemoveHandler もわかります。

デザイナが吐き出したコードは、一通り見ておくと、いつか何かの役に立ちます^^;
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-09-11 14:18
R・田中一郎さん、解説ありがとうございます。
早速designerの中身を見てみました。

grdData という名前の DataGridView なのですが

Friend WithEvents grdData As System.Windows.Forms.DataGridView

・・・の部分のことなのでしょうか?

あとは InitializeComponent でプロパティの設定をしているところしか
見つけられなかったのですが・・・。

すみません。全然わかってなくてT_T


R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-09-11 17:31
引用:

reikoさんの書き込み (2007-09-11 14:18) より:

すみません。全然わかってなくてT_T



ごめんなさい。僕が間違っていました。

reikoさんの投稿を見て実際に確認してみたら、VB ではデザイナの吐き出すコードでイベントハンドラの追加を、定義している部分が含まれていないのですね。
僕は C# な人で、C# ではデザイナが吐き出すコードに含まれているので、てっきり VB もそうしているものだとばかり思っていました。

お詫びの印として、先ほど AddHandler と RemoveHander の使い方を調べてサンプルコードを作ってみました。
参考になさってください。

コード:

Public Sub New()
  InitializeComponent()
  AddHandler Button1.Click, AddressOf MyClick
  RemoveHandler Button1.Click, AddressOf MyClick
End Sub

Private Sub MyClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ・・・ごにょごにょ
End Sub



余計なお手間をとらせてしまって、本当にごめんなさい。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog 満員御礼


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2007-09-11 17:35 ]
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-09-12 09:13
R・田中一郎さん、詳しい解説ありがとうございました!

なるほど!
イベントハンドラの事だったのですね。

何故か私の中でデータのバインディング関係のお話という思い込みがあって、
そっちの方でばっかり考えていたから通じていませんでした^^;
用語をきちんと理解してないとこんなに困るのだと初めて体感してしまいました。

C#ではデザイナでイベントハンドラの追加を定義するところが含まれているのですね。
コードの文章(?)が違うだけであとは同じだと思ってました。
勉強になりました。

本当に有難うございました。今後もよろしくお願い致します。

とりこびと
会議室デビュー日: 2006/10/05
投稿数: 5
投稿日時: 2007-09-26 16:16
とりこびとです。

引用:

R・田中一郎さんの書き込み (2007-09-11 17:31) より:

VB ではデザイナの吐き出すコードでイベントハンドラの追加を、定義している部分が含まれていないのですね。
僕は C# な人で、C# ではデザイナが吐き出すコードに含まれているので、てっきり VB もそうしているものだとばかり思っていました。


Visual Basic でもデザイナが吐き出すコードに含まれていると思いますが・・・?
提示なさったコードでは

コード:
Handles Button1.Click


がその部分になります。
デザイナはAddhandler でイベントハンドラを記述せず、Handles によるイベントハンドラを記述します。

もしかすると「.designer ファイルに」という意味で書かれたのでしょうか?
であれば完全に読み間違いです。すみません。
1

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