FlexGridでソートのキーを複数設定できますか?

解決


NJ  2003-09-23 00:00:54  No: 79518

お世話になります。
Vb6.0  FlexGridControl6.0(SP3)  を使っています。
グリッドは 10行x10列 程です。
今、初めに一列目で全体をソートして、次にその順序を崩さずに
三列目をキーにしてソートしたいのですが(Excelのような感じで)、
まったくわかりません。
アルゴリズムも考えてみましたが、パニックってしまいました。

なにか良い方法ありますか?


藤代千尋  2003-09-23 02:30:50  No: 79519

逆でやってください。
まず 3 列目でソートする。で、1 列目でソートします。(^^)


NJ  2003-09-23 03:11:13  No: 79520

藤代さん、ご回答ありがとうございました。
やり方が悪いのかうまくいきませんでした。。
初心者のため、もう少し教えて頂きたいのです。

Dim index as integer

grid.Col = index
grid.ColSel = grid.Cols - 1
   Select Case index
       Case 3
           .sort = 3
   ここで、三列目でソートしています。
この次にどのように記述すればよいのでしょうか?
本当に申し訳ありませんが、よろしくお願いします。m(_ _)m


NJ  2003-09-23 03:48:36  No: 79521

説明が下手なので追加させてください。。

列1  列2  列3
A1    B1  R
A2    B2  F
A1    B3  F
A1    B4  R
A2    B5  R
A1    B6  F
A1    B7  R
A1    B8  F


A1    B3  F
A1    B6  F
A1    B8  F
A1    B1  R
A1    B4  R
A1    B7  R
A2    B2  F
A2    B5  R

のような感じで、一発でソートしたいと考えています。
列3が最優先のキーで、列1が二番目に優先したいキーです。
申し訳ありませんが、よろしくお願いします。


藤代千尋  2003-09-23 04:53:35  No: 79522

あの、FlexGrid ですよね。

 .Sort = 3 

は、3 列目の指定ではなく、降順でソートする指定ですよ。理解されていますか?
#理解されているとすると、なんで、ソートキー列とソート指定に同じ Index を使用しているか分からない。(-_-;

1 列目と 3 列目、どっちを優先させたいのか、よく分かりませんので、入れ替えて試してください。(^^)
  grid.Col = 3
  grid.Sort = 1  '' 一般的な昇順。
  grid.Col = 1
  grid.Sort = 1  '' 一般的な昇順。
#この例だと、最終的には 1 列目でソートされますが、1 列目の値が同じものは、3 列目でソート済みです。(^^;


NJ  2003-09-24 19:04:12  No: 79523

藤代さん、ご丁寧なご回答ありがとうございます。
FlexGrid です。
また説明不足ですみません。。
メニューエディタで、並べ替えを選択できるようにしています。(インデックス3  には三列目でソートできるように)
それで、メニューエディタのインデックスと、ソートに使いたい列番号を index で対応させています。

説明いただいた様に、記述してやってみました。
確かに、結果が変わり、だいぶよい感じになりました。ありがとうございます。

しかし、2003/09/22(月) 18:48:36  に投稿させていただいた感じにしたいのです
が、どうもうまくいきませんでした。難しいです。。。
無理なのでしょうか。。。


NJ  2003-09-24 19:14:40  No: 79524

.sort=3 (数値昇順)ですが、
その下に投稿した例とは関係ありません。
その例でいけば、
grid.Sort = 1  
ですね。
紛らわしくてすみません。


藤代千尋  2003-09-24 20:07:03  No: 79525

未だによく分かりません。メニューでソート列を決定するとして、どうして 1 → 3 列になるのでしょう?
また、表示されたサンプルは、1 → 3 → 2 です。説明と合っていません。

FlexGrid で複数列をソートする場合、逆順の指定でソートするのが基本的な手法です。なので、それを説明したのですが、こちらで試してみると、確かにうまくいきません。どうもソートを、シェーカーソートかなにかでしているようで、直前のソートが一部崩れてしまいます。

なのでサンプルにあるようにソートするには、Sort = 9 のカスタムを使うことになると思います。

何をしているかは、ヘルプとコードから読みとってください。
Private Sub cmdSort_Click()
    MSHFlexGrid1.Sort = 9
End Sub
Private Sub MSHFlexGrid1_Compare(ByVal Row1 As Long, ByVal Row2 As Long, Cmp As Integer)
    Dim sRow1 As String
    Dim sRow2 As String
    
    With MSHFlexGrid1
        sRow1 = .TextMatrix(Row1, 1) & .TextMatrix(Row1, 3) & .TextMatrix(Row1, 2)
        sRow2 = .TextMatrix(Row2, 1) & .TextMatrix(Row2, 3) & .TextMatrix(Row2, 2)
        
        Cmp = StrComp(sRow1, sRow2)
    End With
End Sub


NJ  2003-09-24 23:09:57  No: 79526

藤代さん、本当にありがとうございました。
私の説明が下手にもかかわらず、教えて頂き感謝しております。
初心者なもので、ソートも今回初めて使い、基本的な手法も分かっていませんでした。
勉強になりました。

お蔭様で、理想のソートができました。
また、コードもなんとか理解することができました。(^^;)

本当にありがとうございました。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加