DataGridViewのAllowUserToOrderColumnsプロパティがTrueになっていて、列の入れ替えができる状態にしています。
列が入れ替わった時、入れ替わる前のDataGridViewの内容を保持して、アンドゥが出来るようにしようと考えています。
入れ替わる前のDataGridViewの内容を取得することはできています。
列が変わった時点でColumnのindexの順番が左から順に並ばなくなってしまうので、列が入れ替わった後に、いったん、入れ替わった後のDataGridViewの内容を一時的に保持してから、DataGridViewをクリアして、DataGridViewを作り直すことを考えています。
この時、ColumnDisplayIndexChangedイベントの途中でDataGridViewのColumnCountを-1にしようとしたのですが、イベント中はColumnCountを変更できないというエラーになり、DataGridViewをクリアできません。
そのため、イベントを抜けてからクリアする動作を行いたいのですが、ColumnDisplayIndexChangedイベントを抜けてすぐに特定の動作をする関数を呼び出すには、どうすればいいでしょうか?
よろしくおねがいします。
直接の解決策ではありませんが、
ハッシュテーブルあたりに、順序変更前の列名と順番(DisplayIndex)を保持っておき、
アンドゥの際に順番(DisplayIndex)を戻してあげれば良いのではないでしょうか?
(グリッドの再作成はしません)
方法 : Windows フォーム DataGridView コントロールの列の順序を変更する
http://msdn.microsoft.com/ja-jp/library/wkfe535h%28VS.80%29.aspx
直接の解決策ではありませんが、
ハッシュテーブルあたりに、順序変更前の列名と順番(DisplayIndex)を保持っておき、
アンドゥの際に順番(DisplayIndex)を戻してあげれば良いのではないでしょうか?
(グリッドの再作成はしません)
方法 : Windows フォーム DataGridView コントロールの列の順序を変更する
http://msdn.microsoft.com/ja-jp/library/wkfe535h%28VS.80%29.aspx
最初のアンドゥスタックへの保存の際に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さんの回答がヒントになりました。
どうもありがとうございました。
DisplayIndexを設定する際は、左から順に設定しなければ、勝手に入れ替わります。
おそらくDataColumnのループをFor EachかColumnIndexで行っていませんか?
正しく並べ替えるにはDisplayIndexをKey、DataColumnをValueとするSortedList等を使用して、元のDisplayIndex順に設定を戻してやればOKです。
最初のアンドゥスタックへの保存の際に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さんの回答がヒントになりました。
どうもありがとうございました。