none
DataGridViewでの行移動イベントのキャンセルについて RRS feed

  • 質問

  • DataGridViewで、取り込んだデータを、矢印キー等で行を入れ替える動作を行います。
    その際、DataGridViewのプロパティにあるSelectionModeを、FullRowSelectに設定した状態でイベントを発生させております。
    これにより、行指定状態 = 行入れ替えのイベント発生になります。

    この動作を行った後で、行の入れ替えをキャンセルして、元の表データ表示の状況に戻したいのですが、そのような動作は、どのようにすれば実現可能でしょうか?

    たとえば、グリッドに100行読み込んでいたとして、10行目と20行目を矢印キーで入れ替え、それぞれが20行目、10行目に表示されるように変更たとします。
    そのあとで、その入れ替えをキャンセルして、10行目->20行目にもってきたものと、20行目->10行目にもってきた行のデータは、もとの10行目、20行目に表示される、というイメージです。
    この動作の途中で、DB等への書き込みは行わないという前提です。
    2009年6月8日 7:43

回答

  • DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。
    キャンセルはどのタイミングでされたいのでしょうか? 普通に考えれば、移動処理した際に移動元と移動先の情報を移動履歴として保持しておき、キャンセル時は移動時と逆のことを行えば良いだけだと思うのですが・・・?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク sk7474 2009年6月18日 9:25
    2009年6月9日 3:14
    モデレータ
  • 初めに投稿した内容と一緒なのですが

    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
    2009年6月9日 9:33

すべての返信


  • 単純に
    初めに読み込んだ情報を保持しておいて、キャンセル時にその保持しておいた情報を再セットするってのはダメですかね。。。

    2009年6月8日 9:07
  • 返信ありがとうございます。
    そのやり方はたぶんうまくいかなさそうです。

    ちなみにこんなことは試してみて、うまくいきませんでした。↓ (ちょっと違うかもしれませんが)

    ----------------------------
    DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。

    このときに利用した値は以下の通り
    DataGridViewCellEventArgs.RowIndex:移動先行インデックス
    DataGridView.CurrentRow.Index:移動元行インデックス
    2009年6月9日 0:38
  • DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。
    キャンセルはどのタイミングでされたいのでしょうか? 普通に考えれば、移動処理した際に移動元と移動先の情報を移動履歴として保持しておき、キャンセル時は移動時と逆のことを行えば良いだけだと思うのですが・・・?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク sk7474 2009年6月18日 9:25
    2009年6月9日 3:14
    モデレータ
  • ----------------------------
    DataGridViewのRowEnterイベント発生時に、一定条件で移動元の行へ戻らせるというのを考えたのですが、フォーカスがイベント関数内で変更ができなかったので断念しました。

    イメージとしてはこうでしょうか?

    1.移動元行を選択する
    2.移動先行を選択する
    3.移動可否をチェック
     3-1.可能:そのまま
     3-2.不可:移動処理の中止 ← これをキャンセルと呼んでいますか?

    ちなみに矢印キーは使用していますか?
    それともマウスだけの操作でしょうか?
    2009年6月9日 5:16
  • 返信ありがとうございます。
    操作としては、動かしたい行を選択して、矢印キー等で、別の場所にその行を動かすというイメージです。
    キャンセルしたいときは、たとえばキャンセルボタンのようなものを用意しておいて、それを押すと、元に戻るという動作を期待しています。
    2009年6月9日 7:07
  • 初めに投稿した内容と一緒なのですが

    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
    2009年6月9日 9:33
  • こんにちは。中川俊輔です。

    Kinsumaさん、trapemiyaさん、回答ありがとうございます。

    masakiyさん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?
    有用な情報と思われたため、勝手ながらKinsumaさん、trapemiyaさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくおねがいします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年6月18日 9:28
  • はじめまして。

     

    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
    2010年12月28日 2:23