人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: 敷守ほむら
●カテゴリ:コンピュータ
✍キーワード:INDEX VB.NET イベント エラー クリア
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● HALSPECIAL
●60ポイント ベストアンサー

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


ハッシュテーブルあたりに、順序変更前の列名と順番(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さんの回答がヒントになりました。

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


2 ● memo77
●10ポイント

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

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


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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ