- - PR -
DataGrid使用時のキーダウンイベント
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-03-27 00:17
はじめて書き込みします。
VB.NetでWindowsFormを作成しているのですが、 DataGridにフォーカスがある状態でファンクションキー押下 イベントを取得したいのですが、イベントが発生しません。 Formのプロパティ「KeyPreview=True」設定は行っていて、 DataGrid以外のフォーム上をクリックするなどすると FormのKeyDownイベントは発生します。 DataGrid上にフォーカスを移してファンクションキーなどを 押下してもFormのKeyDownもDataGridのKeyDownイベントも 発生しません。 どなたか対処方法知ってる方いましたら教えてください。 以上よろしくお願いいたします。 | ||||||||
|
投稿日時: 2003-03-27 12:08
blueさん、はじめまして。
早速ですが、編集モードの状態でファンクションキー押下などを行って いませんか? このDataGridコントロールは、あまり手の込んだ事をするには向いて いないようです。 1.効かないキーがいくつかあるみたいです。 (DataGrid標準ショートカットとか?) 2.編集モードでは、キーイベントが動作しないかと思われます。 (KeyPressイベントは未確認です。ごめんなさい。) 3.KeyDownとKeyUpイベントの間で行われている処理を無効化できない みたいでした。(これは余談) 多分、質問の答えとしては2.かなと思うのですが、どうでしょう。 自分も、[DELETE]キーの行削除を出来ないよう制御したかったのですが、 出来ませんでした。 例えキーイベントを取得できたとしても、[DELETE]キーを無効にする術が なかったのと、行選択(反転)モード時にはイベント取得できなかった為 です。 標準搭載機能としては、コード簡易化できる点では高機能なのですが、 やはりイベントなどの制約が多いので、その辺を制御したいという事で あれば、DataGridは使えないですね。 他のGridコントロールを使用して、自分でゴリゴリ書くのが正解かと思い ます。 | ||||||||
|
投稿日時: 2003-03-27 12:36
ここのとこですが、DataSetのほうのDefaultViewの AllowDeleteプロパティをfalseにしてやると 行削除はできなくなるようです。 DataGridはその内部に抱えてるクラスまで考えて やらないと細かい制御はできないみたいですね。 | ||||||||
|
投稿日時: 2003-03-27 15:34
こんにちわ。
DataGrid内のキーイベントですが、DataGridTextBoxColumn.TextBoxのキーイベントを取得でできるはずです。 | ||||||||
|
投稿日時: 2003-03-27 15:39
http://db-appli.com/xoops/modules/newbb/viewtopic.php?topic_id=193&forum=20&0
このあたりの話でよかったんかな? | ||||||||
|
投稿日時: 2003-03-27 16:50
Astaroth さん、回答ありがとうございます。
編集モードとはReadOnlyプロパティのことだと思うのですが、 以下の設定をおこなってもだめでした。 DataGrid1.ReadOnly = False dataGridColumnStyles(カラム名).ReadOnly = True DataGridに表示されたカラムにフォーカスは移動しますが 変更はきかない状態なので編集モードにはなっていないと 思います。 そもそもやろうとしているのは、DataGrid上にデータベースから 読み込んだ内容を一覧表示し、矢印キーなどで移動しながら 変更したい行へ移動させ、そこでファンクションキー押下し 該当レコードを変更可能な詳細画面へ表示させるという内容です。 左端にあるselectバー(?)上で該当行選択させれば問題なく KeyDownイベントがあがります。 これはもう、DataGridでは無理なのでしょうかね! と書き始めたところで、TOGさんSHUさんの内容を見たのですが、 VB.Netでどのように記述すればよいか何かSampleありませんでしょうか? 以上よろしくお願いします。 | ||||||||
|
投稿日時: 2003-03-27 20:21
まとめて返信・・
これが・・・何故か出来てしまうんです。 プロパティの値はLoad時に変更して、直前の値まで拾ってみてるのですが、見た目上は 削除されてしまいます。DataSet上のロックだけに過ぎないのでしょうかね。 DataSetのUpdateは行っていない(自分で全部やってるので)ので、その辺は未確認なの ですが、それ以前にDataGridの方は消えてしまうので、それで断念しました。
いえ、これは言葉足りずでした。 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 ※カーソルイベント内の制御はもう少し書き加えて下さい。 こんな感じをイメージしているのですが、間違ってたらごめんなさい。 | ||||||||
|
投稿日時: 2003-03-27 21:58
Astaroth さん
できました。 後は微調整するのみでいけそうです。 ありがとうございました。大変助かりました。 | ||||||||
