DataGridViewでのEnter取得に関して


SAHO  2012-01-13 19:49:28  No: 147438

教えて下さい。

DataGridView で、”あるセルに値が入力されたら” というイベントを作成しようと
考えております。

あるセルというのは、取得する事が可能であるところまでは調べ、あとはトリガー
となるイベントですが、

CellValueChanged

等を調べてみましたが、これでは値が変わったらというところまでしか取得でき
ません。

そこで、やはりENTERが押されたらという事をキーに処理したいと考えていますが、
どのように記述すれば良いでしょうか?

KeyDownイベントやKeyPressイベントで拾う事は可能でしょうか?

初歩的な質問で申し訳ありません。

教えて下さい。


VBレスキュー(花ちゃん)  URL  2012-01-14 18:34:29  No: 147439

やりたい事と合っているか解りませんが下記等が参考になりませんか?
http://dobon.net/vb/dotnet/datagridview/textboxevent.html


SAHO  2012-01-16 19:26:33  No: 147440

回答ありがとうございます。

私もそのHPを見つけ、実際にやってみましたが、なかなか
うまくENTERを拾う事ができませんでした。。。

やはり編集中のENTERを拾うことは難しいのでしょうか???


魔界の仮面弁士  2012-01-16 20:55:46  No: 147441

# 未検証、うろ覚えで回答しています。

> DataGridView で、”あるセルに値が入力されたら” というイベントを作成しようと
> 考えております。

「値が入力されたとき」というのが、具体的にどの段階か曖昧ですが、
データバインドしているのであれば、BindingSource や
DataTable 側のイベントで処理できるかと思います。しかし、
もしもバインド先に渡す前にチェックしたいのであれば、
編集コントロール(TextBox/CheckBox等)のイベントで
処理する必要があるでしょう。

非バインド項目の場合は、DataGridView 側の CellEndEdit イベントか
OnCellEndEdit メソッドあたりで採れそうですが、セルの種類によっては
Enter 確定を実施するために EndEdit の呼び出しが必要かも知れません。


SAHO  2012-01-16 22:13:02  No: 147442

早速のご返答ありがとうございます。

非バインドである為、教えて頂いたとおりのやり方で
なんとか処理できそうです。

いろんなHPを検索しましたが、以下のURLにあるように
http://www.vbstation.net/tips/datagridviewenter.htm
http://www.vbstation.net/tips/inherits_control.htm
ユーザコントロールを作成し、、、というような事はやらなくても
良いのでしょうか?

ENTERを取得するためにはしなければならないのでしょうか???

教えて下さい。


魔界の仮面弁士  2012-01-17 03:36:54  No: 147443

困っているのかがどの部分か分からないので、
> ”あるセルに値が入力されたら”
の話と
> 値が変わったらというところまでしか取得できません。
の部分を、もう少し具体的に説明していただけないでしょうか。

DataGridView に対して、デザイン時にどんな設定をした上で、
  ・DataGridView の CellValueChanged イベントを使ったコード
  ・編集コントロールの KeyDown や KeyPress イベントを使ったコード
を、それぞれどのように記述してみたのか。
そしてそれらを実行したときに、実際の結果がどうなってしまうので、
Enter を押したときに判定する方法に切り替えたいのか、その理由。

——といった部分を、第三者が実際に試せるような、
最小限にまとめた抜粋ソース(あるいは処理手順)と共に
提示されてくれば、もう少し話が進むかと思います。

現状は、非バインドという情報さえ後出しになっていましたし、
そもそもセルの型がチェックボックスなのかテキストなのか
ドロップダウンなのかも分からない上に、実際のコードも不明です。

この状況では、記述したコードに問題があるのか、それとも
処理方法(どのイベントを使うかなど)を見直すべきなのか、
あるいは方法は正しいけれど環境その他の要因で問題が生じて
いるのかといった問題個所すら特定できず、回答しずらいです…。


VBレスキュー(花ちゃん)  2012-01-17 09:06:03  No: 147444

>やはり編集中のENTERを拾うことは難しいのでしょうか???

答えた責任上試して見ましたら、取得できましたよ。
編集中のテキストボックスを取得してそのテキストボックスの
PreviewKeyDown イベントで取得する事ができました。
但し、テキストボックスと仮定して


SAHO  2012-01-17 18:04:03  No: 147445

魔界の仮面弁士様、VBレスキュー様、ご回答ありがとうございます。

そうですね、、、もう少し詳細に記述しないとダメですね。。。すみません。

状態としては、フォーム上にDataGridViewを貼り付け、そこへ項目として
発注番号、発注日付・・・というように項目を設けています。

既に発注されたデータを検索し、そのDataGridViewに表示させたいと考えて
いる為、発注番号が入力された場合、テーブルに検索に行くというような事を
想定しています。

その為、記述としては、まず発注番号が入力され、ENTERが押されたという
事をトリガーとしたかった為、

Private Sub DataGridview1_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles DataGridview1.PreviewKeyDown

    If e.KeyCode = Keys.Enter Then
        Debug.WriteLine("Enter")
    End If

End Sub

という単純な記述をしてみました。

結果として、入力され、ENTERを押しても上記のロジックへは入って来ず、
次の行が表示される為、そこでENTERを押した場合に、上記ロジックが動作
するというような形となってしまっています。

教えて頂いたように、DataGridView で  PreviewKeyDown  をしてみましたが、
ダメでした。。。

私の記述が何かおかしいのでしょうか。。。

よろしくお願いします。


VBレスキュー(花ちゃん)  2012-01-17 19:21:24  No: 147446

それは、編集中のテキストボックスのイベントでは無いですよね。
>発注番号が入力された場合、テーブルに検索に行くというような事を
想定しています。

という事はセルが編集状態になっているという事ですよね
Form に DataGridView1  を貼り付け下記を試して見て下さい。

Public Class Form1

Private WithEvents dgvEditTextBox As New DataGridViewTextBoxEditingControl

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
                     ByVal e As DataGridViewEditingControlShowingEventArgs) _
                                 Handles DataGridView1.EditingControlShowing
   If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
      dgvEditTextBox = CType(e.Control, DataGridViewTextBoxEditingControl)
   End If
End Sub

Private Sub dgvEditTextBox_PreviewKeyDown(ByVal sender As Object, _
               ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) _
                           Handles dgvEditTextBox.PreviewKeyDown
   If e.KeyCode = Keys.Enter Then Stop
End Sub

End Class


VBレスキュー(花ちゃん)  2012-01-17 19:36:23  No: 147447

提示されたコードでも一応取得する事はできます。
(セルが青い状態の時 Enter キーを押して)

Private Sub DataGridview1_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System. _
                  Windows.Forms.PreviewKeyDownEventArgs) Handles DataGridView1.PreviewKeyDown
   If e.KeyCode = Keys.Enter Then
      Debug.WriteLine("Enter")
   End If
End Sub

他にコードが記入されていない状態で確認して見て下さい


SAHO  2012-01-17 20:38:15  No: 147448

VBレスキュー様、ご回答ありがとうございました!!

上記の内容を実行してみたら、正しくENTERを認識する事ができました。

本当にありがとうございます。

2件目の回答の事ですが、青くなっている状態では私の記述でも
問題ありませんでした。

但し、発注番号を入力し終わった状態(青くなっていない状態)で、ENTERを
押した時には、これでは拾うことができず、やはり1件目の内容の方で認識する事ができました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加