【VB.NET】VB.NETのDataGridViewに関する質問です。

DataGridViewのAllowUserToOrderColumnsプロパティがTrueになっていて、列の入れ替えができる状態にしています。
列が入れ替わった時、入れ替わる前のDataGridViewの内容を保持して、アンドゥが出来るようにしようと考えています。
入れ替わる前のDataGridViewの内容を取得することはできています。
列が変わった時点でColumnのindexの順番が左から順に並ばなくなってしまうので、列が入れ替わった後に、いったん、入れ替わった後のDataGridViewの内容を一時的に保持してから、DataGridViewをクリアして、DataGridViewを作り直すことを考えています。
この時、ColumnDisplayIndexChangedイベントの途中でDataGridViewのColumnCountを-1にしようとしたのですが、イベント中はColumnCountを変更できないというエラーになり、DataGridViewをクリアできません。
そのため、イベントを抜けてからクリアする動作を行いたいのですが、ColumnDisplayIndexChangedイベントを抜けてすぐに特定の動作をする関数を呼び出すには、どうすればいいでしょうか?
よろしくおねがいします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/03/11 17:00:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:HALSPECIAL No.1

回答回数407ベストアンサー獲得回数86

ポイント60pt

直接の解決策ではありませんが、


ハッシュテーブルあたりに、順序変更前の列名と順番(DisplayIndex)を保持っておき、

アンドゥの際に順番(DisplayIndex)を戻してあげれば良いのではないでしょうか?

(グリッドの再作成はしません)


方法 : Windows フォーム DataGridView コントロールの列の順序を変更する

http://msdn.microsoft.com/ja-jp/library/wkfe535h%28VS.80%29.aspx

id:tail_furry

最初のアンドゥスタックへの保存の際にDisplayIndexの位置は保持しています。

列を入れ替えた際に、Indexの順番が変わってしまうので、例えば4列あるうちの2列目と3列目を入れ替えた時に、DataGridView.Column(1)は3列目、DataGridView.Column(2)は2列目を指し示すことになり、1列目から4列目まで保持していたデータをDataGridView.Item(x, y).ValueやDataGridView.Columns(x).HeaderCell.Valueに戻すときに、2列目として保持していたデータを戻すときには、DataGridView.Item(1, y)やDataGridView.Columns(1).HeaderCell.Valueは2列目にいれているように見えて、Indexのせいで表示上は3列目に入ってきちゃうんです。3列目に入れるのも逆になります。

なんか間違ってるんでしょうかTT

もしかしたら、アンドゥで表示を戻す際にDisplayIndexをみて戻した方がいいのかもと思い、ちょっと修正してみます。

アンドゥで戻す際にDisplayIndexを見て戻す方法で上手くいきました。HALSPECIALさんの回答がヒントになりました。

どうもありがとうございました。

2010/03/11 16:59:44

その他の回答1件)

id:HALSPECIAL No.1

回答回数407ベストアンサー獲得回数86ここでベストアンサー

ポイント60pt

直接の解決策ではありませんが、


ハッシュテーブルあたりに、順序変更前の列名と順番(DisplayIndex)を保持っておき、

アンドゥの際に順番(DisplayIndex)を戻してあげれば良いのではないでしょうか?

(グリッドの再作成はしません)


方法 : Windows フォーム DataGridView コントロールの列の順序を変更する

http://msdn.microsoft.com/ja-jp/library/wkfe535h%28VS.80%29.aspx

id:tail_furry

最初のアンドゥスタックへの保存の際にDisplayIndexの位置は保持しています。

列を入れ替えた際に、Indexの順番が変わってしまうので、例えば4列あるうちの2列目と3列目を入れ替えた時に、DataGridView.Column(1)は3列目、DataGridView.Column(2)は2列目を指し示すことになり、1列目から4列目まで保持していたデータをDataGridView.Item(x, y).ValueやDataGridView.Columns(x).HeaderCell.Valueに戻すときに、2列目として保持していたデータを戻すときには、DataGridView.Item(1, y)やDataGridView.Columns(1).HeaderCell.Valueは2列目にいれているように見えて、Indexのせいで表示上は3列目に入ってきちゃうんです。3列目に入れるのも逆になります。

なんか間違ってるんでしょうかTT

もしかしたら、アンドゥで表示を戻す際にDisplayIndexをみて戻した方がいいのかもと思い、ちょっと修正してみます。

アンドゥで戻す際にDisplayIndexを見て戻す方法で上手くいきました。HALSPECIALさんの回答がヒントになりました。

どうもありがとうございました。

2010/03/11 16:59:44
id:memo77 No.2

回答回数238ベストアンサー獲得回数20

ポイント10pt

DisplayIndexを設定する際は、左から順に設定しなければ、勝手に入れ替わります。

おそらくDataColumnのループをFor EachかColumnIndexで行っていませんか?


正しく並べ替えるにはDisplayIndexをKey、DataColumnをValueとするSortedList等を使用して、元のDisplayIndex順に設定を戻してやればOKです。

  • id:memo77
    クリアしようという方向性が間違っていますね。
    HALSPECIALさんが回答されていそうなのでちょっと様子見。
  • id:memo77
    回答しておきましたが、いまちょっと時間がなくてサンプルコードを載せられません。
    1日頑張ってできなければ、あとでサンプルコードを書きますね。
  • id:tail_furry
    SortedListを使う方法なんてあるんですね。
    SortedListは使ったことがなかったので、さっそく使ってみました。
    memo77さんの方法だとDisplayIndexとDataColumnで、ということでしたが、
    こちらのソースの都合上IndexとDisplayIndexを結びつけることでソースを簡略化することができました。
    あとでmemo77さんにもポイントお送りしておきますね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません