tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridViewにイベントを加えるには
記事No5929
投稿日: 2007/07/27(Fri) 16:19
投稿者ひでと
よくわからないままDataGridViewを使用してしまいました。
セルに値をいれる事はできたのですが、「さて Change イベントの処理を作ろう」
と思った時、イベントが無いことに気がつきました。
そこで、
「DataGridViewに独自のCangeイベントをつける」又は
「別の似たようなコントロールに変える」
必要があるのですが、初心者にハードルの低い方法をアドバイスお願いします。

必要なのは、1つのセルを変更したとき、同じレコードのほかのセルを変更したいだけなのです。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: DataGridViewにイベントを加えるには
記事No5930
投稿日: 2007/07/27(Fri) 18:17
投稿者花ちゃん
> セルに値をいれる事はできたのですが、「さて Change イベントの処理を作ろう」
> と思った時、イベントが無いことに気がつきました。
> そこで、
> 「DataGridViewに独自のCangeイベントをつける」又は

何がしたいのかよく解らないのですが、CurrentCellChanged イベント では
だめなのですか?

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.currentcellchanged(VS.80).aspx

たいていのイベントは揃っているかと思うのですが。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview_members(VS.80).aspx


> 必要なのは、1つのセルを変更したとき、同じレコードのほかのセルを変更したいだけなのです。

Cangeイベント とどう関係するのでしょうか?(Cangeイベント でないとだめな理由は)

[ツリー表示へ]
タイトルRe^2: DataGridViewにイベントを加えるには
記事No5931
投稿日: 2007/07/27(Fri) 19:35
投稿者魔界の仮面弁士
> 何がしたいのかよく解らないのですが、CurrentCellChanged イベント では
> だめなのですか?

「セルの変更」というのは、CurrentCellChanged (別のセルに移動)のような
意味ではなく、「セルの値の変更」の方の意味なのかも…?

で、もしそうだとすれば、CellValueChanged が使えるでしょう。

ただしこれは、セルを移動するなどしないと、イベントが発生しません。
もし、テキストボックスの TextChanged のように、キー入力等に
即座に反応したいなら、EditingControlShowing イベントのタイミングで、
TextBox(というか、DataGridViewTextBoxEditingControl) 等を得て、
それらのイベントに対して AddHandler するのが一般的かと思います。
(コンボボックスタイプの場合も同様)

あと、チェックボックスタイプの場合は、チェックされた直後に CellValueChanged が
発生するように、CurrentCellDirtyStateChanged 時に CommitEdit メソッドを呼んで、
値を早期にコミットしてやると使いやすいかも知れません。参考までに。

[ツリー表示へ]
タイトルRe^3: DataGridViewにイベントを加えるには
記事No5939
投稿日: 2007/07/30(Mon) 10:48
投稿者ひでと
ありがとうございました。

> > 何がしたいのかよく解らないのですが、CurrentCellChanged イベント では
> > だめなのですか?
>
> 「セルの変更」というのは、CurrentCellChanged (別のセルに移動)のような
> 意味ではなく、「セルの値の変更」の方の意味なのかも…?
>
> で、もしそうだとすれば、CellValueChanged が使えるでしょう。
>
> ただしこれは、セルを移動するなどしないと、イベントが発生しません。
> もし、テキストボックスの TextChanged のように、キー入力等に
> 即座に反応したいなら、EditingControlShowing イベントのタイミングで、
> TextBox(というか、DataGridViewTextBoxEditingControl) 等を得て、
> それらのイベントに対して AddHandler するのが一般的かと思います。
> (コンボボックスタイプの場合も同様)
>
> あと、チェックボックスタイプの場合は、チェックされた直後に CellValueChanged が
> 発生するように、CurrentCellDirtyStateChanged 時に CommitEdit メソッドを呼んで、
> 値を早期にコミットしてやると使いやすいかも知れません。参考までに。
はい、「セルの値の変更」のことでした。エクセルのセルに値を入れるような感じの処理です。
EditingControlShowing イベントにCase文で処理を入れることでうまく動きました。
ありがとうございました。今回は AddHandler する必要がなさそうです。
おそくなりまして、申し訳ありませんでした。

[ツリー表示へ]
タイトルRe^4: DataGridViewにイベントを加えるには
記事No5943
投稿日: 2007/07/30(Mon) 16:58
投稿者ひでと
> > ただしこれは、セルを移動するなどしないと、イベントが発生しません。
> > もし、テキストボックスの TextChanged のように、キー入力等に
> > 即座に反応したいなら、EditingControlShowing イベントのタイミングで、
> > TextBox(というか、DataGridViewTextBoxEditingControl) 等を得て、
> > それらのイベントに対して AddHandler するのが一般的かと思います。
> > (コンボボックスタイプの場合も同様)

> EditingControlShowing イベントにCase文で処理を入れることでうまく動きました。
> ありがとうございました。今回は AddHandler する必要がなさそうです。

すいません。必要ありました。
    Private Sub dgv1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgv1.EditingControlShowing
        AddHandler e.Control.TextChanged, AddressOf dgv1_Change
    End Sub
と処理しましたが、別の疑問として、AddHandlerしたものを、RemoveHandlerしないと
まずいのでしょうか?
また、この場合 dgv1_Change内でRemoveHandlerするべきなのでしょうか?

[ツリー表示へ]
タイトルRe^5: DataGridViewにイベントを加えるには
記事No5963
投稿日: 2007/07/31(Tue) 12:58
投稿者魔界の仮面弁士
> と処理しましたが、別の疑問として、AddHandlerしたものを、RemoveHandlerしないと
> まずいのでしょうか?
RemoveHandler しておいた方が安全だと思いますよ。
削除せずにおくと、1 回の変更動作(TextChaned)だけで、同じイベント ハンドラが
複数回呼び出されてしまうことがあります。

他の編集セルに移動するなどして、2回目以降の EditingControlShowing が発生すると、
そこでまた再度 AddHandler されることになるため、1回の TextChanged イベント処理で、
同じメソッドが複数回呼び出されてしまうことになってしまうのです。
(二重登録しないようにすれば問題は無いですけど)


> また、この場合 dgv1_Change内でRemoveHandlerするべきなのでしょうか?
RemoveHandler しない方が安全だと思いますよ。
削除してしまうと、2回以上の連続した変更動作(TextChanged)があった場合に、
最初のイベントハンドラしか呼び出されなくなってしまいます。

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

[ツリー表示へ]
タイトルRe^6: DataGridViewにイベントを加えるには
記事No5978
投稿日: 2007/08/01(Wed) 08:59
投稿者ひでと
ありがとうございました。昨日留守にしており御礼がおくれました。
> > と処理しましたが、別の疑問として、AddHandlerしたものを、RemoveHandlerしないと
> > まずいのでしょうか?
> RemoveHandler しておいた方が安全だと思いますよ。
> 削除せずにおくと、1 回の変更動作(TextChaned)だけで、同じイベント ハンドラが
> 複数回呼び出されてしまうことがあります。
>
> 他の編集セルに移動するなどして、2回目以降の EditingControlShowing が発生すると、
> そこでまた再度 AddHandler されることになるため、1回の TextChanged イベント処理で、
> 同じメソッドが複数回呼び出されてしまうことになってしまうのです。
> (二重登録しないようにすれば問題は無いですけど)
>
>
> > また、この場合 dgv1_Change内でRemoveHandlerするべきなのでしょうか?
> RemoveHandler しない方が安全だと思いますよ。
> 削除してしまうと、2回以上の連続した変更動作(TextChanged)があった場合に、
> 最初のイベントハンドラしか呼び出されなくなってしまいます。
>
> http://dobon.net/vb/dotnet/datagridview/textboxevent.html
上記参考にさせていただきます。

[ツリー表示へ]
タイトルこうしました
記事No5981
投稿日: 2007/08/01(Wed) 10:23
投稿者ひでと
ありがとうございました。同じイベント内で処理した方が良いように思いましたので
    Private Sub dgv1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgv1.EditingControlShowing
        RemoveHandler e.Control.TextChanged, AddressOf dgv1_Change
        AddHandler e.Control.TextChanged, AddressOf dgv1_Change
    End Sub
このようにしました。

[ツリー表示へ]