DataGridViewでのEnter取得に関して


SAHO  2012-01-13 19:49:28  No: 147438  IP: [192.*.*.*]

教えて下さい。

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

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

CellValueChanged

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

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

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

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

教えて下さい。

編集    削除
VBレスキュー(花ちゃん)  URL  2012-01-14 18:34:29  No: 147439  IP: [192.*.*.*]

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

編集    削除
SAHO  2012-01-16 19:26:33  No: 147440  IP: [192.*.*.*]

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

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

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

編集    削除
魔界の仮面弁士  2012-01-16 20:55:46  No: 147441  IP: [192.*.*.*]

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

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

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

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

編集    削除
SAHO  2012-01-16 22:13:02  No: 147442  IP: [192.*.*.*]

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

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

いろんな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  IP: [192.*.*.*]

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


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

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


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

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

編集    削除
VBレスキュー(花ちゃん)  2012-01-17 09:06:03  No: 147444  IP: [192.*.*.*]

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

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

編集    削除
SAHO  2012-01-17 18:04:03  No: 147445  IP: [192.*.*.*]

魔界の仮面弁士様、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  IP: [192.*.*.*]

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

という事はセルが編集状態になっているという事ですよね
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  IP: [192.*.*.*]

提示されたコードでも一応取得する事はできます。
(セルが青い状態の時 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  IP: [192.*.*.*]

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

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

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

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

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

編集    削除
たかはし  2022-09-09 20:44:51  No: 150434  IP: [192.*.*.*]

お世話になります。

VBレスキューさんの記述を元に
以下のように変更しています。

 'DataGridView1(2 の時フォーカスが下の行へ移動してしまうのですが
以下のように移動しない方法はあるものでしょうか。

 'フォーカスが下に移動しないようにする
  e.Handled = True


 Private Sub dgvEditTextBox_PreviewKeyDown(ByVal sender As Object, _
                  ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) _
                                 Handles dgvEditTextBox.PreviewKeyDown

        Dim s_gyou As Integer

        If e.KeyCode = Keys.Enter Then 'Stop
            'DataGridView1.CurrentCell.Value = DataGridView1.CurrentCell.Value.ToUpper

            '現在の行を退避
            s_gyou = (DataGridView1.CurrentCell.RowIndex)
            'DataGridView1.CurrentCell.Value = DataGridView1.CurrentCell.Value.ToUpper



            '移動
            If DataGridView1.CurrentCell.ColumnIndex = 0 Then
                DataGridView1.CurrentCell = DataGridView1(1, s_gyou)
            ElseIf DataGridView1.CurrentCell.ColumnIndex = 1 Then  
                DataGridView1.CurrentCell = DataGridView1(2, s_gyou)
                'DataGridView1(2 は表示している中で一番右になります。
     'この時フォーカスが下の行へ移動
            End If
        End If

    End Sub

編集    削除