DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewの並び替えを元に戻すには?

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

【解決したい問題】

DataGridViewの並び替えの質問です。よろしくお願いいたします。

DataSet内のDataTableをDataGridViewにバインドして、列のソートをAutomaticに設定していますが、いったんヘッダをクリックしてソートしてしまうと、後は降順か昇順かのトグルになってしまって元に戻すことができません。後からデータを入力するとそれもソートされてしまいます。

使用者がヘッダクリックでソートした後でも、ソートする前の並び順に戻しデータの追加をしてもソートのない状況に戻すボタンを設置したいのですが、Sortメソッドもソートをする方向だけのようで元に戻すこともソートの状態を解除することもわからなくて行き詰ってしまいました。

何かヒントでもありましたら、お教えいただきたくよろしくお願いいたします。
> DataSet内のDataTableをDataGridViewにバインドして、列のソートをAutomaticに設定していますが、いったんヘッダをクリックしてソートしてしまうと、後は降順か昇順かのトグルになってしまって元に戻すことができません。後からデータを入力するとそれもソートされてしまいます。
>
> 使用者がヘッダクリックでソートした後でも、ソートする前の並び順に戻し
それはつまり、「ヘッダをクリックすることで起きるソートを無効にする」と同じ意味でしょうか?
もしそうなら、DataGridViewの各列のソート設定を「NotSortable」にします。
というか、そもそもどの順番(どの列を基準とした順序)にしたいのでしょうか?

また、ソートの機能は、DataGridiViewの各列はもちろん、メソッドを使ったソート、(もしBindingSourceを使ってDataGridViewのDataSourceを設定してるなら)BindingSourceのSortプロパティの設定にも左右されます。
読み込み時のみならば、SQLの段階でORDER BYに何を持ってきているかも関わってきます。

読み込み以降は、SQLを除くこれらのうち、どれか一つに統一して使用しないと、結果的に一体どの順に並んでいるのかわからない状態になります。


> データの追加をしてもソートのない状況に戻す
ソートのない、とは?
さっそくの返信ありがとうございます。

わかりにくくて申し訳ありません。
例えば、「住所」という列があるとします。データは任意の住所で追加されていきます。ソートする前には普通に最後尾にデータが追加されていきます。

しかし作業途中では、住所をヘッダのクリックでソートし、地域別にまとめて作業をしやすくしたい場合もあるので、DataGlidViewの「住所」の列のソート設定をAutmaticにしています。しかし、デバッグしてみると、一度ヘッダをクリックしてソートすると、その後は、クリックするたびに降順か昇順に並び替えられるばかりで、データが追加されたままの順番に戻すことができません。

そこで何らかの方法で、ソートが必要なくなったら、ソート前のデータが追加された順に戻したい、ということです。
>>データの追加をしてもソートのない状況に戻す
> ソートのない、とは?
新規データを追加しても自動的に並び替えられないで最後尾に表示される状態、ということです。現状では一度ソートすると三角マークが消えず、常に並び替えられてしまいます。

バインドしているDataTableは単純にDatasetを追加して作成したもので、外部のデータベースには連結していません。
DataTable1BindingSourceにSortの設定もしておりません。またプログラム内でも他にソートの設定をしているところはありません。

DataGridViewで並び替えたあと、DataTableをDataSet1.DataTable1.WriteXml()で書き出してみると、データが追加されたとおり(並び替えられてはいない)になっていました。

どうぞよろしくお願いいたします。
■No22274に返信(moranさんの記事)
> 例えば、「住所」という列があるとします。データは任意の住所で追加されていきます。ソートする前には普通に最後尾にデータが追加されていきます。
>
> しかし作業途中では、住所をヘッダのクリックでソートし、地域別にまとめて作業をしやすくしたい場合もあるので、
> そこで何らかの方法で、ソートが必要なくなったら、ソート前のデータが追加された順に戻したい
つまり…、
・ヘッダでのソートは作業中のみ
・基本的には「新しいものほど後ろ」
と捉えてよろしいでしょうか。

そうなると、これは仕様に突っ込む話になってしまいますが、
DataTableにソート用の列を作っておき、それを基準としては如何でしょうか?

確かに、DataGridViewのソート設定は「Automatic」で且つその他は一切デフォルトのままだと、新規追加の情報は勝手に最後尾に追加されます。

しかし、それは「情報が古い順」等と決まってるわけではない(「どの行が新規かどうか」はDataGridViewではなく登録した本人が知っている状態)ので
ヘッダをクリック = ソートに「基準」を与えれば途端に「新規か否か」は無関係になります。
そして、前述の通り基本的にソートについてはデフォルトのままなわけですから、
それ以降はヘッダに出ている列を基準としたソートしかできなくなります。

そこで、ソート用の列を加えて(DataGridView上に見せる(VisibleをTrueにする)かどうかはまた別)、
「ボタンを押したら強制的にソートの基準を「ソート用列」」という処理を書けば

>ソートが必要なくなったら、ソート前のデータが追加された順に

に戻せるではないか、と考えています。
返信をありがとうございます。

> つまり…、
> ・ヘッダでのソートは作業中のみ
> ・基本的には「新しいものほど後ろ」
> と捉えてよろしいでしょうか。
>
> そうなると、これは仕様に突っ込む話になってしまいますが、
> DataTableにソート用の列を作っておき、それを基準としては如何でしょうか?

ご理解のとおりです。
なるほど、簡単にメソッドなどで戻せるようなわけには行かないのですね。
さっそく、新規の列を作成してソートのボタンを作成し、試してみました。
本来ならナンバリング等をそこで行なっておけばよいのでしょうが、試しにナンバリングの処理を書く前に何も入力されていない列でソートをさせてみたら元通りの並びに戻りました。
ナンバリング等をしないでこのままいければ、これまでのデータもそのまま使えるのでとても助かるのですが、入力無しの列のソートになにか問題があるでしょうか?

ともかくもご助言本当にありがとうございました。適当なメソッドが見つからないので途方に暮れましたが、視点を変えて考えるべきでした。
解決済みにチェックを入れさせていただきます。
もし入力無しの列のソートに問題があるようでしたらお教えいただければ幸いです。



>
> 確かに、DataGridViewのソート設定は「Automatic」で且つその他は一切デフォルトのままだと、新規追加の情報は勝手に最後尾に追加されます。
>
> しかし、それは「情報が古い順」等と決まってるわけではない(「どの行が新規かどうか」はDataGridViewではなく登録した本人が知っている状態)ので
> ヘッダをクリック = ソートに「基準」を与えれば途端に「新規か否か」は無関係になります。
> そして、前述の通り基本的にソートについてはデフォルトのままなわけですから、
> それ以降はヘッダに出ている列を基準としたソートしかできなくなります。
>
> そこで、ソート用の列を加えて(DataGridView上に見せる(VisibleをTrueにする)かどうかはまた別)、
> 「ボタンを押したら強制的にソートの基準を「ソート用列」」という処理を書けば
>
> >ソートが必要なくなったら、ソート前のデータが追加された順に
>
> に戻せるではないか、と考えています。
>
>
解決済み!
■No22276に返信(moranさんの記事)
>入力無しの列のソートになにか問題があるでしょうか?
「如何なるときでも意図した順序になる」ことが保障されません。
偶然や、「高確率でこうなる」というようなことに頼っていることになります。
また、全行空(全行同値)なら実質的にその列があってもなくても同じ、ということであり、
結局はソートの基準がないのと同じです。
2008/06/16(Mon) 08:37:57 編集(投稿者)

■No22278に返信(カドルドエグさんの記事)

> 「如何なるときでも意図した順序になる」ことが保障されません。

やはりそういうことになるのですね。
読み込んだり、入力したときに常にナンバリングできるように考えます。

たびたび本当にありがとうございました。
確実なプログラミングを心がけるようにいたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板