- PR -

動的にイベントを追加した場合した場合の動作

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-02-27 19:37
DataGridView コントロールの DataGridViewTextBoxColumn の列によって入力された
値を監視するため、次のようなコードを書きました。
問題なく動いているのですが1点気になるところがあるので教えて下さい。

コード:
public コンストラクタ() {
    base.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(base_EditingControlShowing);
}

private void base_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
    if (e.Control.GetType().Name == "DataGridViewTextBoxEditingControl") {
        
        //この処理について教えて欲しいのです!!!!!!!!!!!!!!!!!!!!!!!!!!!
        e.Control.KeyPress +=new KeyPressEventHandler(TextBox_KeyPress);
        //この処理について教えて欲しいのです!!!!!!!!!!!!!!!!!!!!!!!!!!!
        
    }
}

private void TextBox_KeyPress(object sender, KeyPressEventArgs e) {
    // ここに入力値を検査するコードを書く予定・・・
}



//この処理について教えて欲しいのです!!!!!!!!!!!!!!!!!!!!!!!!!!!
で挟んだ部分の処理ですが、セルが入力状態になる度に、実行されることになります。
従って、e.Control.KeyPress によって呼び出されるハンドラが、その分追加され続け
てしまうことになるのでしょうか?

目的としては、テキストボックス編集時に入力された値を1文字ずつ検査して、然る
べき処理ができれば、それで良いのですが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-27 19:43
引用:

R・田中一郎さんの書き込み (2006-02-27 19:37) より:

で挟んだ部分の処理ですが、セルが入力状態になる度に、実行されることになります。
従って、e.Control.KeyPress によって呼び出されるハンドラが、その分追加され続け
てしまうことになるのでしょうか?


逆に聞きますが、そのイベント ハンドラは期待したタイミングで、
2 回以上実行されてしまうことがありますか?

それと、

引用:

if (e.Control.GetType().Name == "DataGridViewTextBoxEditingControl") {


ここがコンパイル解決できていないのが気になります。(^-^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-02-27 20:16
引用:

R・田中一郎さんの書き込み (2006-02-27 19:37) より:
e.Control.KeyPress によって呼び出されるハンドラが、その分追加され続け
てしまうことになるのでしょうか?


そうなりますね。
同じテキストボックスであれば、一回のKeyPressでTextBox_KeyPress()が複数回呼び出されるようになるはずです。

引用:

R・田中一郎さんの書き込み (2006-02-27 19:37) より:
目的としては、テキストボックス編集時に入力された値を1文字ずつ検査して、然る
べき処理ができれば、それで良いのですが。


KeyPressで1文字ずつ入力検査ですか?"貼り付け"された場合はどうします?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-28 01:39
どうも本題を逃していたようですね。

引用:

R・田中一郎さんの書き込み (2006-02-27 19:37) より:

目的としては、テキストボックス編集時に入力された値を1文字ずつ検査して、然る
べき処理ができれば、それで良いのですが。


この手の質問、最近また多くなりましたね。

  テキストボックスに全角文字バイト数制限を制御したい

バイト数を検証している部分を「検査」するように変えれば流用可能かと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-01 09:43
引用:

じゃんぬねっとさんの書き込み (2006-02-27 19:43) より:

引用:

R・田中一郎さんの書き込み (2006-02-27 19:37) より:

で挟んだ部分の処理ですが、セルが入力状態になる度に、実行されることになります。
従って、e.Control.KeyPress によって呼び出されるハンドラが、その分追加され続け
てしまうことになるのでしょうか?


逆に聞きますが、そのイベント ハンドラは期待したタイミングで、
2 回以上実行されてしまうことがありますか?



なるほど!
呼び出した回数分だけ実行されているようです。
と言うことは追加され続けているのですね。

では、DataGridView に DataGridViewTextBoxColumn や DataGridViewComboBoxColumn
の列があって、DataGridViewTextBoxColumn の列に属するセルに対して編集がなされ
た場合の、TextChanged や、KeyPressイベントで処理されるようにするためには、ど
のように書けば良いのでしょうか?

引用:

じゃんぬねっとさんの書き込み (2006-02-27 19:43) より:

引用:

if (e.Control.GetType().Name == "DataGridViewTextBoxEditingControl") {


ここがコンパイル解決できていないのが気になります。(^-^



おや?、ここはコンパイル通っているんですが・・・

引用:

一郎さんの書き込み (2006-02-27 20:16) より:

KeyPressで1文字ずつ入力検査ですか?"貼り付け"された場合はどうします?



まだ何も考えていません(^-^;

引用:

じゃんぬねっとさんの書き込み (2006-02-28 01:39) より:

  テキストボックスに全角文字バイト数制限を制御したい

バイト数を検証している部分を「検査」するように変えれば流用可能かと思います。


ありがとうございます。
早速確認してみます。


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-03-01 10:05 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-01 10:48
引用:

R・田中一郎さんの書き込み (2006-03-01 09:43) より:

呼び出した回数分だけ実行されているようです。
と言うことは追加され続けているのですね。


そんなわけで、試してわかることは試すと良いです。(^-^;)

引用:

おや?、ここはコンパイル通っているんですが・・・


そういう意味で言うならば「コンパイル通りませんよ」と書くハズです。
コンパイル解決というのは、コンパイル時に評価 "の" 正当性が解決することを指します。

引用:

e.Control.GetType().Name == "DataGridViewTextBoxEditingControl"


DataGridViewTextBoxEditingControl が存在するかどうかは、コンパイラは知りません。
ただし、これが型そのものを示すのであれば、コンパイラは知ることができます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-01 11:27
引用:

じゃんぬねっとさんの書き込み (2006-03-01 10:48) より:
引用:

R・田中一郎さんの書き込み (2006-03-01 09:43) より:

呼び出した回数分だけ実行されているようです。
と言うことは追加され続けているのですね。


そんなわけで、試してわかることは試すと良いです。(^-^



すみませんでした。
決して横着した訳では無いのです。
ずっと目的どおり正しく動いていると思っていて「複数追加されること==2回呼び出される筈」という発想ができなかったのです。
何れにせよ、この方法では、DataGridViewTextBoxColumn 列の編集で生じるイベント
を捕まえることはできないようですね。

引用:

じゃんぬねっとさんの書き込み (2006-03-01 10:48) より:

引用:

おや?、ここはコンパイル通っているんですが・・・


そういう意味で言うならば「コンパイル通りませんよ」と書くハズです。
コンパイル解決というのは、コンパイル時に評価 "の" 正当性が解決することを指します。

引用:

e.Control.GetType().Name == "DataGridViewTextBoxEditingControl"


DataGridViewTextBoxEditingControl が存在するかどうかは、コンパイラは知りません。
ただし、これが型そのものを示すのであれば、コンパイラは知ることができます。



多分、上記はコンパイルが解決できないことに関する説明が記述されているのだと
思うのですが、僕にはこの意味が理解できませんでした。

DataGridViewTextBoxColumn の列に編集が開始された時に、そのコントロールのタイ
プを調べて、目的のものならイベントを追加すればうまくいくと思ったのですが。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-03-01 12:33
型の判定をしたいならis演算子やas演算子あたりを使うほうが
一般的かな。
コード:
if(e.Control is DataGridViewText....)
{
  // いろいろ
}
とか
DataGridViewTe... c = e.Control as Da....;
if(c != null)
{
  // いろいろ〜
}


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