C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DataGridViewのEnterキー押下について


(過去ログ 105 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■62627 / inTopicNo.1)  DataGridViewのEnterキー押下について
  
□投稿者/ さちも (1回)-(2011/10/23(Sun) 01:07:55)

分類:[VB.NET/VB2005 以降] 

VB.net2010・.Net Framework4.0で小規模なシステムを開発しています。
# 現在、開発環境のない端末から投稿しておりますので
# ソースコード等を掲載できない状態です。
# お見苦しい点はご容赦ください。

システムには複数のFormがあります。
各FormにDataGridViewとButtonを配置し、
ボタンのクリックでDataGridViewの入力内容のチェックや入力内容のDBへの登録などの
処理を行っています。
ユーザーの「できるだけキー操作で業務を行いたい」という要望で
FormのAcceptButtonプロパティに画面上のButtonを設定しています。

ユーザーに動作を見ていただいたところ
「DataGridViewにフォーカスがあると、Enterキーを押下しても
 ボタン押下時の処理が行われない」と指摘されました。

DataGridViewのKeyUpイベントでKeys.Enterを拾って
AcceptButton.PerformClick()を実行したところ
Enterキー押下と同じ動作をしました。

ところが、入力内容にエラーがあった場合は
ダイアログを表示して処理を終わらせているのですが
このダイアログをマウスクリックではなくEnterキー押下で終了させると
再度DataGridViewのKeyUpイベントが実行されます。
結果的に、マウスでクリックするまで
同じダイアログが何度でも表示されてしまいます。

この現象を回避しようと同じプロジェクトのメンバーと今日一日悩みましたが
解決に至りませんでした。
試しに

Form.AcceptButton.PerformClick()
For ii As Integer = 0 to 9
  DoEvents()
  Thread.Sleep(100)
Next

等のコードを実行してみたのですが
やはり思うような結果は得られませんでした。

このような現象を解決された経験のある方や
何かアイディアをお持ちの方がいらっしゃいましたら
お知恵を貸していただけますでしょうか。

不明点等は、ご指摘いただけましたら随時補足させていただきます。
ただ、現在多忙につき返信が遅くなりますことご容赦下さい。
虫のいい話で申し訳ありませんが、よろしくお願いします。
引用返信 編集キー/
■62630 / inTopicNo.2)  Re[1]: DataGridViewのEnterキー押下について
□投稿者/ NF64 (7回)-(2011/10/23(Sun) 07:45:33)
KeyUpイベントではなく、KeyDownイベントを使用する。
またはダイアログ表示中である事を示すフラグを持たせる。

これらの方法は使用できないのでしょうか。
引用返信 編集キー/
■62663 / inTopicNo.3)  Re[2]: DataGridViewのEnterキー押下について
□投稿者/ さちも (2回)-(2011/10/24(Mon) 23:10:55)
No62630 (NF64 さん) に返信
> KeyUpイベントではなく、KeyDownイベントを使用する。
> またはダイアログ表示中である事を示すフラグを持たせる。


ご回答ありがとうございました。いただいたご意見と
他所(OFFICE TANAKA様だったと思いますが、詳しいURLは忘れてしまいました)での
質問&および回答から、下記のようなコードを書いて
何とか思うような動作を得られました。
長くなりますが、ご容赦ください。


■DataGridView側

''' <summary>
''' DataGridViewを継承したクラス
''' </summary>
''' <remarks></remarks>
Public Class DataGridViewEX
  Inherits System.Windows.Forms.DataGridView

  Private m_Editing As Boolean = False

  ''' <summary>
  ''' セルの編集開始イベント
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  ''' <remarks></remarks>
  Private Sub CellBeginEditEx(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles MyBase.CellBeginEdit

    ''フラグを「編集中」にする
    m_Editing = True
  End Sub

  ''' <summary>
  ''' セルの編集終了イベント
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  ''' <remarks></remarks>
  Private Sub CellEndEditEx(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles MyBase.CellEndEdit

    ''フラグを「編集中じゃないよ」にする
    m_Editing = False
  End Sub

  ''' <summary>
  ''' セルの編集状態通知処理
  ''' </summary>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public Function IsCellEditing() As Boolean

    ''セルが編集中かどうかを返す
    Return Me.m_Editing
  End Function
End Class

■Form側
・上記DataGridViewEXとボタンを1つずつ配置
・Form.AcceptButtonプロパティを設定


Public Class Form1

  ''' <summary>
  ''' 画面 起動イベント
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  ''' <remarks></remarks>
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ''DataGridViewに明細行を追加
    Me.dgv.RowCount = 3
  End Sub

  ''' <summary>
  ''' 一覧 キーダウン
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  ''' <remarks></remarks>
  Private Sub dgv_KeyDown(ByVal sender As System.Object, _
              ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown

    ''DataGridViewが編集中の場合はデフォルトの動作をさせる。
    If dgv.IsCellEditing() Then
      Return
    End If

    ''Enterキーが押された?
    If e.KeyCode = Keys.Enter Then

      ''イベントを「処理済」状態にする
      e.Handled = True

      ''フォームの「既定のボタン」のクリックイベントを呼ぶ
      Me.AcceptButton.PerformClick()
    End If
  End Sub

  ''' <summary>
  ''' ボタン クリックイベント
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  ''' <remarks></remarks>
  Private Sub btn01_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn01.Click

    MsgBox("Hello World !")

  End Sub
End Class

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -