- 題名: DataGridView上にコンボボックスがある場合のダブルクリックについて
- 日時: 2010/05/20 18:35:39
- ID: 26851
- この記事の返信元:
- (なし)
- この記事への返信:
- [26881] Re[1]: DataGridView上にコンボボックスがある場合のダブルクリックについて2010/05/26 22:24:03
- ツリーを表示
お疲れ様です。
要件に合わないかもしれませんが、
編集モードに入った状態でComboBoxをDoubleClickすると
「出力」ウィンドウにメッセージを表示するサンプルです。
簡単のため、DoubleClick検出処理に漏れがありますが
参考になれば幸いです。
(処理内容)
・NativeWindowを使い、ComboBox上のMouse押下を検出
→ DoubleClckを手動で判定
・DataGridViewのDoubleClickイベントも併用
Public Class Form_CboDBlClickTest
Inherits Form
' DataGridView
Dim WithEvents _dgv As New DataGridView
' ComboBox上のMouse押下を検出するためのNativeWindowオブジェクト
Dim _cbonativewindow As New CboNativeWindow
' Form初期表示時の処理(DataGridView組み立て)
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
With Me._dgv
.EditMode = DataGridViewEditMode.EditOnEnter
.Columns.Add("列1", "列1")
Dim cbo As DataGridViewComboBoxColumn = Me._createComboBoxColumn
cbo.Name = "列2"
.Columns.Add(cbo)
.Dock = DockStyle.Fill
.RowCount = 10
End With
Me.Controls.Add(Me._dgv)
MyBase.OnLoad(e)
End Sub
' ComboBox列を作成するヘルパメソッド
Private Function _createComboBoxColumn() As DataGridViewComboBoxColumn
Dim cbo As New DataGridViewComboBoxColumn
Dim dt As New DataTable
dt.Columns.Add("Code", GetType(String))
dt.Columns.Add("Name", GetType(String))
dt.Rows.Add("コード1", "値1")
dt.Rows.Add("コード2", "値2")
dt.Rows.Add("コード3", "値3")
dt.Rows.Add("コード4", "値4")
cbo.ValueMember = "Code"
cbo.DisplayMember = "Name"
cbo.DataSource = dt
cbo.DisplayStyleForCurrentCellOnly = True
Return cbo
End Function
' DataGridViewのDoubleClickイベントも併用する
Private Sub _dgv_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles _dgv.DoubleClick
Console.WriteLine("DGVDoubleClick")
End Sub
' ComboBox列が編集モードに入るときに、ComboBoxにNativeWindowを適用し、
' Mouse押下を検出する。
Private Sub _dgv_EditingControlShowing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles _dgv.EditingControlShowing
If TypeOf e.Control Is ComboBox Then
Me._cbonativewindow.AttachControl(e.Control)
End If
End Sub
' 編集モード終了時に、ComboBoxをNativeWindowから解放
Private Sub _dgv_CellEndEdit(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles _dgv.CellEndEdit
Me._cbonativewindow.DetachControl()
End Sub
' ComboBoxのMouse押下検出用のNativeWindow
' DataGridViewの編集コントロールのMouseDown・MouseUpイベントでは
' うまくいかなかったので、代わりにこれを使用
Private Class CboNativeWindow
Inherits NativeWindow
' Mouse押下を検出したいComboBox
Dim WithEvents _cbo As Control
' ComboBox上のWindowMessageをWndProcで捕捉可能にする
Public Sub AttachControl(ByVal cbo As Control)
Me._cbo = cbo
MyBase.AssignHandle(cbo.Handle)
End Sub
'
Public Sub DetachControl()
If Me._cbo IsNot Nothing Then
Me._cbo = Nothing
MyBase.ReleaseHandle()
End If
End Sub
'
Private Sub _cbo_HandleDestroyed(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles _cbo.HandleDestroyed
Me.DetachControl()
End Sub
' ComboBox上のMouse押下を検出し、ダブルクリック判定処理に渡す。
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_LBUTTONDOWN As Integer = &H201
Const WM_LBUTTONUP As Integer = &H202
Select Case m.Msg
Case WM_LBUTTONDOWN
Me._testSpecialMatch("D"c)
Case WM_LBUTTONUP
Me._testSpecialMatch("U"c)
End Select
MyBase.WndProc(m)
End Sub
' MouseDown+MouseUp+MouseUpでダブルクリックとみなす
Private ReadOnly _matchPattern As String = "DUU"
' MouseDown+MouseUp+MouseUpでダブルクリックとみなすための判定処理
Private Sub _testSpecialMatch(ByVal inputchar As Char)
Console.WriteLine(inputchar)
' ダブルクリックの時間間隔判定用の変数
Static timeoffirstclick As DateTime = DateTime.MinValue
' Me._matchPatternのどこまで進んだかを保持する変数
Static specialkeyindex As Integer = 0
If Me._matchPattern.Chars(specialkeyindex) = inputchar Then
If specialkeyindex = 0 Then
' ダブルクリック開始時間を記憶
timeoffirstclick = DateTime.Now
End If
specialkeyindex += 1
' 所定時間内にパターン末尾まで来た場合は、ダブルクリックとみなす
If specialkeyindex >= Me._matchPattern.Length Then
specialkeyindex = 0
If (DateTime.Now - timeoffirstclick).TotalMilliseconds <= SystemInformation.DoubleClickTime Then
Console.WriteLine("MatchDBLCLICK")
End If
End If
Else
specialkeyindex = 0
End If
End Sub
End Class
End Class
分類:[VB6以前]
2010/05/20(Thu) 20:07:24 編集(投稿者)
【解決したい問題】
DataGridViewの列に表示したコンボボックをダブルクリックして
別画面に飛ぶようにしたく、
DataGridViewのダブルクリックイベントを使用したのですが、
まずセルを選択するためにクリックし、さらにセルを編集状態にするためにクリックし、最後にドロップダウンさせるためにクリックし、
さらにエンターキーかタブキーで選択した項目を確定させないと、
ダブルクリックできません。
項目を確定させなくてもダブルクリックできるようにするには、
どうすればよいでしょうか?
【解決するために何をしたか】
こちらで紹介されていました、
「DataGridViewのコンボボックスのドロップダウンリストが一回のクリックで表示されるようにする」
をしたところ、今度はダブルクリック自体きかなくなりました。