SSブログ

DataGridViewのコンボボックスをDELキーでクリアしたい [program]

カスタマイズしていたパッケージソフトのコントールが不具合で使用できず、
急遽標準のグリッドに置き換えることになった。
なるべく動作を合わせなくてはならない。

「コンボボックス表示されるセルの値をDELキーでクリアする」という仕様で行き詰った。

DataGridViewのEditingControlShowingイベントでDataGridViewComboBoxEditingControlを取得して、
そのKeyDownイベントでSelectedIndex = -1を設定するところまでは、すぐに思いついた。

しかし、すでにセルに値が設定されていると、
フォーカスが離れた後に元の値に戻ってしまうのだ。
これには頭を抱えてしまった。

結局、編集終了後のCellEndEditイベントで、
SelectedIndex = -1ならセルに空文字を設定することにした。
その後DataGridViewComboBoxEditingControlへの参照をクリアしてしまうので、
CellEndEditイベントでは、DataGridViewComboBoxEditingControlへの参照が存在するかどうかをチェックすることにした。

サンプルはVB2008Exp、グリッドはアンバウンドです。
仕事でExpて悲しいでしょ・・・

''' DataGridViewに表示されるDataGridViewComboBox
Private WithEvents DataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing

'''カラムの列挙
Private Enum GridCol As Integer
	Text = 0
	Value = 1
End Enum

''' DataGridViewにDataGridViewComboBoxが表示されたら取得する
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
	ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
	Handles DataGridView1.EditingControlShowing
	
	If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
		Dim DGView As DataGridView = DirectCast(sender, DataGridView)

		Me.DataGridViewComboBox = _
		DirectCast(e.Control,DataGridViewComboBoxEditingControl)
	End If
End Sub


''' DataGridViewComboBoxのイベントでDELキーを受け、リストをクリアする
Private Sub DataGridViewComboBox_KeyDown(ByVal sender As Object, _
	ByVal e As System.Windows.Forms.KeyEventArgs) _
	Handles DataGridViewComboBox.KeyDown
	
	If e.Alt = False AndAlso e.Control = False AndAlso e.KeyCode = Keys.Delete Then
		Dim DGVComboBox As DataGridViewComboBoxEditingControl = _
		DirectCast(sender, DataGridViewComboBoxEditingControl)
		DGVComboBox.SelectedIndex = -1
	End If
End Sub


'''編集終了時にリストが選択されていなければ、
'''セルに空文字を入れて、 DataGridViewComboBoxを初期化
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _
	ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
	Handles DataGridView1.CellEndEdit
	
	If Not Nothing Is Me.DataGridViewComboBox Then
		If Me.DataGridViewComboBox.SelectedIndex = -1 Then
			Dim DGView As DataGridView = _
			DirectCast(sender, DataGridView)
			DGView.Rows(e.RowIndex).Cells(GridCol.Value).Value = ""
		End If

		Me.DataGridViewComboBox = Nothing
	End If
End Sub


※プログラム関係の記事がたまったら別ブログにしようと思います。
nice!(4)  コメント(0)  トラックバック(0) 

nice! 4

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0