- PR -

[VB.NET] F2キーを押すとDataGridのスクロールバーが消える

1
投稿者投稿内容
クリス
会議室デビュー日: 2004/07/13
投稿数: 11
投稿日時: 2004-08-16 11:02
いつもお世話になっております。

VB.NETでWindowsFormアプリを作成しています。
コードは以下のようになっています。
また読み込んでいるデータベースは「test」というテーブルに「文字」というカラムがあります。


コード:

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

'この3つはフォームデザイナで宣言している
'Me.TopMost = True
'Me.KeyPreview = True
'DataGrid1.ReadOnly = True

'データベースからデータセットにtestテーブルを読み込む
OleDbDataAdapter1.Fill(DsTest1, "test")

'TableStylesの定義
Dim ts As DataGridTableStyle
ts = DataGrid1.TableStyles("test")

'一列目のGridColumnStylesの定義
Dim cs As DataGridTextBoxColumn = _
CType(ts.GridColumnStyles(0), DataGridTextBoxColumn)

'一列目のTextBoxにキーダウンのハンドラを割り当てる
Dim tb As TextBox = cs.TextBox
AddHandler tb.KeyDown, AddressOf tb_KeyDown

End Sub

Private Sub DataGrid1_Paint(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGrid1.Paint

Me.TopMost = True

'もし表示する行が存在しない場合は処理を行わない
If DataGrid1.VisibleRowCount <> 0 Then

Dim colStyle As DataGridColumnStyle
colStyle = Me.DataGrid1.TableStyles(0).GridColumnStyles(0)

'編集モード解除
DataGrid1.EndEdit(colStyle, Me.BindingContext(DsTest1, "test").Position, True)
'行選択
DataGrid1.Select(Me.BindingContext(DsTest1, "test").Position)

End If

End Sub

Private Sub Form1_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

KeyDownEvent(e)

End Sub

Private Sub tb_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)

KeyDownEvent(e)

End Sub

Private Sub KeyDownEvent(ByVal e As KeyEventArgs)

Select Case e.KeyCode

Case Keys.F1
'文字という名前のカラムにTextBox1のTextを含んでいるデータのみを表示する
'要するに絞込み処理

Dim filterString As String
filterString = "%" & TextBox1.Text & "%"

'SQL
OleDbDataAdapter1.SelectCommand.CommandText = "SELECT * FROM test WHERE 文字 LIKE '" & filterString & "' "

'DataGrid1に表示される内容を更新する
DsTest1.Clear()
OleDbDataAdapter1.Fill(DsTest1)

End Select

End Sub



このコードを実行してすぐに、F2→F1の順でキーを押すとDataGridのスクロールバーが消えてしまいます。

もし解決策や問題点等が分かる方がいらっしゃいましたら、ご教授の程よろしくお願いします。


■追記
使用しているコンポーネントは
 DataGrid1 (DataGrid)
 TextBox1 (TextBox)
 OleDbConnection1 (OleDbConnection)
 OleDbDataAdapter1 (OleDbDataAdapter)
 DsTest1 (DsTest という名前でOleDbDataAdapter1から生成されたデータセット)
になります。

[ メッセージ編集済み 編集者: クリス 編集日時 2004-08-16 11:14 ]
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-16 13:55
再現試験をしていないのでわかっていることだけを・・・

F2はセルをダブルクリックするのと同じ動作になります。
行選択時はどうなるんでしょうか? その辺に問題は無いでしょうか?

<参考ページ>
Windows フォームの DataGrid コントロール内の移動に使用できるキーボード ショートカット
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbgrfkeyboardshortcutsfordatagrid.asp
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
クリス
会議室デビュー日: 2004/07/13
投稿数: 11
投稿日時: 2004-08-16 14:20
>えムナウ様
>>F2はセルをダブルクリックするのと同じ動作になります。
>>行選択時はどうなるんでしょうか? その辺に問題は無いでしょうか?

それについても検証しましたが、ダブルクリックではこの現象は起きませんでした。
おそらくダブルクリックした場合はDataGridのPaintがハンドルするため、コードに書いてある通りに選択モードを強制的に変更してしまいF2キーを押したときとは違う状況になってしまって居るのだと思います。


・・・と、ここまで書いたところで「じゃあF1キーが押されたときにも同じように強制的に変更してしまえば良いのではないか」と思い当たりました。

試してみたところ、見事に解決しました(やや無理矢理な方法の気もしますが)。

えムナウ様、ありがとうございました。


■追記
ただ、どういう理由でこのような現象が起きたのかがよく分からないと言うのは不安なので、もし知っている方が居たらご教授願います。

[ メッセージ編集済み 編集者: クリス 編集日時 2004-08-16 14:53 ]
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-16 14:55
処理的にはF2の処理が終わった後にやったほうがいいと思うんですが。
そうするとF2以外のほかのキーでの処理も考えなくてはいけなくなるので、
F1でいいのではないかと思います。
決して無理やりではないと思います。
コメントにそうした理由を書いておくとなおさらいいと思います。

>えムナウ様
様はやめてください。こそばゆいです。
「さん」でいいです。
#ここの皆さんそうだとおもいますが。
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
クリス
会議室デビュー日: 2004/07/13
投稿数: 11
投稿日時: 2004-08-16 15:28
>えムナウさん
>>処理的にはF2の処理が終わった後にやったほうがいいと思うんですが。
>>そうするとF2以外のほかのキーでの処理も考えなくてはいけなくなるので、
>F1でいいのではないかと思います。
それも考えたのですが、そもそもこのコードの方法ではF2キーのキーイベントが取得できないのでF1キーの方で処理しました。ちなみにF5キーも取得できません。F2キーはデフォルトで機能が割り当てられてるからだと考えても、F5キーが駄目な理由はよく分かりません・・・。

>様はやめてください。こそばゆいです。
ごめんなさい。今度から「さん」にしてみたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)