- PR -

DataGrid使用時のキーダウンイベント

投稿者投稿内容
blue
会議室デビュー日: 2003/03/26
投稿数: 3
投稿日時: 2003-03-27 00:17
はじめて書き込みします。
VB.NetでWindowsFormを作成しているのですが、
DataGridにフォーカスがある状態でファンクションキー押下
イベントを取得したいのですが、イベントが発生しません。

Formのプロパティ「KeyPreview=True」設定は行っていて、
DataGrid以外のフォーム上をクリックするなどすると
FormのKeyDownイベントは発生します。

DataGrid上にフォーカスを移してファンクションキーなどを
押下してもFormのKeyDownもDataGridのKeyDownイベントも
発生しません。

どなたか対処方法知ってる方いましたら教えてください。
以上よろしくお願いいたします。
Astaroth
会議室デビュー日: 2003/03/12
投稿数: 9
投稿日時: 2003-03-27 12:08
blueさん、はじめまして。

早速ですが、編集モードの状態でファンクションキー押下などを行って
いませんか?

このDataGridコントロールは、あまり手の込んだ事をするには向いて
いないようです。

1.効かないキーがいくつかあるみたいです。
  (DataGrid標準ショートカットとか?)
2.編集モードでは、キーイベントが動作しないかと思われます。
  (KeyPressイベントは未確認です。ごめんなさい。)
3.KeyDownとKeyUpイベントの間で行われている処理を無効化できない
  みたいでした。(これは余談)

多分、質問の答えとしては2.かなと思うのですが、どうでしょう。


自分も、[DELETE]キーの行削除を出来ないよう制御したかったのですが、
出来ませんでした。
例えキーイベントを取得できたとしても、[DELETE]キーを無効にする術が
なかったのと、行選択(反転)モード時にはイベント取得できなかった為
です。

標準搭載機能としては、コード簡易化できる点では高機能なのですが、
やはりイベントなどの制約が多いので、その辺を制御したいという事で
あれば、DataGridは使えないですね。
他のGridコントロールを使用して、自分でゴリゴリ書くのが正解かと思い
ます。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-03-27 12:36
引用:

Astarothさんの書き込み (2003-03-27 12:08) より:
自分も、[DELETE]キーの行削除を出来ないよう制御したかったのですが、
出来ませんでした。



ここのとこですが、DataSetのほうのDefaultViewの
AllowDeleteプロパティをfalseにしてやると
行削除はできなくなるようです。

DataGridはその内部に抱えてるクラスまで考えて
やらないと細かい制御はできないみたいですね。
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-03-27 15:34
こんにちわ。

DataGrid内のキーイベントですが、DataGridTextBoxColumn.TextBoxのキーイベントを取得でできるはずです。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-03-27 15:39
http://db-appli.com/xoops/modules/newbb/viewtopic.php?topic_id=193&forum=20&0

このあたりの話でよかったんかな?
blue
会議室デビュー日: 2003/03/26
投稿数: 3
投稿日時: 2003-03-27 16:50
Astaroth さん、回答ありがとうございます。

編集モードとはReadOnlyプロパティのことだと思うのですが、
以下の設定をおこなってもだめでした。

DataGrid1.ReadOnly = False
dataGridColumnStyles(カラム名).ReadOnly = True

DataGridに表示されたカラムにフォーカスは移動しますが
変更はきかない状態なので編集モードにはなっていないと
思います。

そもそもやろうとしているのは、DataGrid上にデータベースから
読み込んだ内容を一覧表示し、矢印キーなどで移動しながら
変更したい行へ移動させ、そこでファンクションキー押下し
該当レコードを変更可能な詳細画面へ表示させるという内容です。

左端にあるselectバー(?)上で該当行選択させれば問題なく
KeyDownイベントがあがります。

これはもう、DataGridでは無理なのでしょうかね!

と書き始めたところで、TOGさんSHUさんの内容を見たのですが、
VB.Netでどのように記述すればよいか何かSampleありませんでしょうか?

以上よろしくお願いします。
Astaroth
会議室デビュー日: 2003/03/12
投稿数: 9
投稿日時: 2003-03-27 20:21
まとめて返信・・
引用:

shuさんの書き込み (2003-03-27 12:36) より:
> ここのとこですが、DataSetのほうのDefaultViewの
> AllowDeleteプロパティをfalseにしてやると
> 行削除はできなくなるようです。



これが・・・何故か出来てしまうんです。
プロパティの値はLoad時に変更して、直前の値まで拾ってみてるのですが、見た目上は
削除されてしまいます。DataSet上のロックだけに過ぎないのでしょうかね。
DataSetのUpdateは行っていない(自分で全部やってるので)ので、その辺は未確認なの
ですが、それ以前にDataGridの方は消えてしまうので、それで断念しました。

引用:

blueさんの書き込み (2003-03-27 16:50) より:
> 編集モードとはReadOnlyプロパティのことだと思うのですが、



いえ、これは言葉足りずでした。
DataGrid上の見た目のことです。分けるなら、
・「選択モードで、セル位置(列)がどこか分からないモード」
  (初期表示時も通常はこれ)
・「選択モードで、行(又は列)選択モード」
  (行or列が反転している状態)
・「編集モード」
  (セル内にカーソルがあって、変更待ちの状態)
という感じなのですが・・・。


blueさんのやりたい事を考えると、いつも「行選択モード」にしておいてやれば、
Keyイベントが取得できて、いい感じになると思うのですが、どうでしょう?

Private Sub DataGrid1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGrid1.KeyDown
MsgBox(e.KeyCode)
End Sub
Private Sub DataGrid1_CursorChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.CursorChanged

Dim objGrid As DataGrid
Dim nRow As DataGrid.HitTestInfo
Dim colStyle As DataGridColumnStyle

objGrid = sender
colStyle = Me.DataGrid1.TableStyles(0).GridColumnStyles(0)
'編集モード解除(一応)
objGrid.EndEdit(colStyle, Me.BindingContext(ds, 対象TABLE).Position, True)
'行選択モード
objGrid.Select(Me.BindingContext(ds, 対象TABLE).Position)

End Sub

※カーソルイベント内の制御はもう少し書き加えて下さい。

こんな感じをイメージしているのですが、間違ってたらごめんなさい。
blue
会議室デビュー日: 2003/03/26
投稿数: 3
投稿日時: 2003-03-27 21:58
Astaroth さん

できました。
後は微調整するのみでいけそうです。

ありがとうございました。大変助かりました。

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