トップ回答者
DataGridViewでの行移動イベントのキャンセルについて

質問
-
DataGridViewで、取り込んだデータを、矢印キー等で行を入れ替える動作を行います。
その際、DataGridViewのプロパティにあるSelectionModeを、FullRowSelectに設定した状態でイベントを発生させております。
これにより、行指定状態 = 行入れ替えのイベント発生になります。
この動作を行った後で、行の入れ替えをキャンセルして、元の表データ表示の状況に戻したいのですが、そのような動作は、どのようにすれば実現可能でしょうか?
たとえば、グリッドに100行読み込んでいたとして、10行目と20行目を矢印キーで入れ替え、それぞれが20行目、10行目に表示されるように変更たとします。
そのあとで、その入れ替えをキャンセルして、10行目->20行目にもってきたものと、20行目->10行目にもってきた行のデータは、もとの10行目、20行目に表示される、というイメージです。
この動作の途中で、DB等への書き込みは行わないという前提です。
回答
-
DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。
キャンセルはどのタイミングでされたいのでしょうか? 普通に考えれば、移動処理した際に移動元と移動先の情報を移動履歴として保持しておき、キャンセル時は移動時と逆のことを行えば良いだけだと思うのですが・・・?
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク sk7474 2009年6月18日 9:25
-
初めに投稿した内容と一緒なのですが
1.DBサーバよりGridに表示するデータを取得
2.Grid表示用に1で取得内容を複製する
3.2で作成した内容をGridにセットする
4.行入れ替え捜査を行う
5.キャンセルボタン押下時、1で取得した内容を2に再セットする
※以下3からの繰り返し
結局、DB取得時用とGrid表示用と2つ情報を保持していれば可能なのですが。。。
簡単に思いつくのは、こんな感じなのですが。
どうでしょうか。
行入替作業を、複数回行い、1つ前に戻るといったようなキャンセルを行いたい場合は
trapemiyaさんがおしゃっているように、履歴情報を保持してください。- 回答としてマーク sk7474 2009年6月18日 9:25
すべての返信
-
返信ありがとうございます。
そのやり方はたぶんうまくいかなさそうです。
ちなみにこんなことは試してみて、うまくいきませんでした。↓ (ちょっと違うかもしれませんが)
----------------------------
DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。
このときに利用した値は以下の通り
DataGridViewCellEventArgs.RowIndex:移動先行インデックス
DataGridView.CurrentRow.Index:移動元行インデックス -
DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。
キャンセルはどのタイミングでされたいのでしょうか? 普通に考えれば、移動処理した際に移動元と移動先の情報を移動履歴として保持しておき、キャンセル時は移動時と逆のことを行えば良いだけだと思うのですが・・・?
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク sk7474 2009年6月18日 9:25
-
初めに投稿した内容と一緒なのですが
1.DBサーバよりGridに表示するデータを取得
2.Grid表示用に1で取得内容を複製する
3.2で作成した内容をGridにセットする
4.行入れ替え捜査を行う
5.キャンセルボタン押下時、1で取得した内容を2に再セットする
※以下3からの繰り返し
結局、DB取得時用とGrid表示用と2つ情報を保持していれば可能なのですが。。。
簡単に思いつくのは、こんな感じなのですが。
どうでしょうか。
行入替作業を、複数回行い、1つ前に戻るといったようなキャンセルを行いたい場合は
trapemiyaさんがおしゃっているように、履歴情報を保持してください。- 回答としてマーク sk7474 2009年6月18日 9:25
-
はじめまして。
DataGridViewやそのほか、コントロールには、検証イベント(**Validating)があるので、このタイミングで、
e.Cancel=true で、イベントをキャンセルします。
このケースの場合、DataGridViewで、FullRowSelectですから、RowValidatingイベントを使うとOKです。
他の方がおっしゃってる、前回値を保持させておいて、戻すのでもいいと思いますが、
無駄なイベント処理の実施が発生するため、大きいデータの場合は避けたいところです。
以下のMSDNを参考してみてください。
Windowsフォーム DataGridViewコントロールのデータを検証する
http://msdn.microsoft.com/ja-jp/library/7ehy30d4(VS.80).aspx
- 回答の候補に設定 matsukawar 2010年12月28日 2:26