tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルTreeViewのソート
記事No12545
投稿日: 2008/06/16(Mon) 16:18
投稿者はじめちゃん
TreeViewコントロールで
 .Sorted=True
に設定してもプロパティーページで
 並べ替え
をチェックしても。
ノードがソートされないのですが。
何か設定が足りないのでしょうか?

何方かご指導下さいますよう。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: TreeViewのソート
記事No12548
投稿日: 2008/06/16(Mon) 17:05
投稿者魔界の仮面弁士
> ノードがソートされないのですが。
どのようなノードなのか、具体的なデータを教えてください。

> 何か設定が足りないのでしょうか?
下記のコードにおいて、期待通りにソートされますか?


Private Sub Form_Load()
    TreeView1.Sorted = False
    TreeView2.Sorted = False
End Sub

Private Sub Command1_Click()
    TreeView1.Sorted = True
    TreeView1.Nodes.Add Text:="aaaa"
    TreeView1.Nodes.Add Text:="cccc"
    TreeView1.Nodes.Add Text:="bbbb"
    
    TreeView2.Nodes.Add Text:="aaaa"
    TreeView2.Nodes.Add Text:="cccc"
    TreeView2.Nodes.Add Text:="bbbb"
    TreeView2.Sorted = True
End Sub

[ツリー表示へ]
タイトルRe^2: TreeViewのソート
記事No12552
投稿日: 2008/06/16(Mon) 18:09
投稿者はじめちゃん
魔界の仮面弁士様
いつもご指導ありがとう御座います。
いただいたサンプルではこちらの環境でもソートされるのですが。

私のコードは以下のような事をしているのですが。
順番どおりに出力されるだけでソートされません。

    With TreeView1
        .Nodes.Clear
        .Sorted = True
        .LabelEdit = tvwManual
        .LineStyle = tvwRootLines
        Set objNode = .Nodes.Add(, , "R0", "サーバ", "Folder", "Folder")
        objNode.Tag = "1選択したテンプレートフォルダ \\サーバ" & vbCrLf & "選択したベースフォルダ \\サーバ"
        objNode.Expanded = True
        For i = UBound(avModels, 1) To 0 Step -1
            If (avModels(i, 3) = 1) Then
                Set objNode = .Nodes.Add("R" & avModels(i, 2), tvwChild, "R" & avModels(i, 1), avModels(i, 0), "Folder", "Folder")
                objNode.Tag = "1名前: " & avModels(i, 0) & vbCrLf & _
                            "ID: " & avModels(i, 1) & vbCrLf & _
                            "タイプ: " & iifType(avModels(i, 3)) & vbCrLf & _
                            "パス: " & avModels(i, 9)
            End If
        Next i
        For i = 0 To UBound(avModels, 1)
            If (avModels(i, 3) = 2) Then
                Set objNode = .Nodes.Add("R" & avModels(i, 2), tvwChild, "Key" & i, avModels(i, 0), "Model", "Model")
                objNode.Tag = "2名前: " & avModels(i, 0) & vbCrLf & _
                            "ID: " & avModels(i, 1) & vbCrLf & _
                            "タイプ: " & iifType(avModels(i, 3)) & vbCrLf & _
                            "パス: " & avModels(i, 9) & vbCrLf & vbCrLf & _
                            iifPublished(avModels(i, 4)) & vbCrLf & _
                            "バージョン: " & avModels(i, 6) & vbCrLf & _
                            "前回保存日: " & avModels(i, 5) & vbCrLf & _
                            "作成者: " & avModels(i, 7)
            ElseIf (avModels(i, 3) = 3) Then
                Set objNode = .Nodes.Add("R" & avModels(i, 2), tvwChild, "Key" & i, avModels(i, 0), "Base", "Base")
                objNode.Tag = "3名前: " & avModels(i, 0) & vbCrLf & _
                            "ID: " & avModels(i, 1) & vbCrLf & _
                            "タイプ: " & iifType(avModels(i, 3)) & vbCrLf & _
                            "パス: " & avModels(i, 9) & vbCrLf & vbCrLf & _
                            iifPublished(avModels(i, 4)) & vbCrLf & _
                            "バージョン: " & avModels(i, 6) & vbCrLf & _
                            "前回保存日: " & avModels(i, 5) & vbCrLf & _
                            "作成者:" & avModels(i, 7)
            ElseIf (avModels(i, 3) = 4) Then
                Set objNode = .Nodes.Add("R" & avModels(i, 2), tvwChild, "Key" & i, avModels(i, 0), "Template", "Template")
                objNode.Tag = "4名前: " & avModels(i, 0) & vbCrLf & _
                            "ID: " & avModels(i, 1) & vbCrLf & _
                            "タイプ: " & iifType(avModels(i, 3)) & vbCrLf & _
                            "パス: " & avModels(i, 9) & vbCrLf & vbCrLf & _
                            "バージョン: " & avModels(i, 6) & vbCrLf & _
                            "前回保存日: " & avModels(i, 5) & vbCrLf & _
                            "作成者: " & avModels(i, 7)
            End If
        Next i
        .Refresh
    End With

[ツリー表示へ]
タイトルRe^3: TreeViewのソート
記事No12553
投稿日: 2008/06/16(Mon) 20:56
投稿者魔界の仮面弁士
> 私のコードは以下のような事をしているのですが。
> 順番どおりに出力されるだけでソートされません。

Tag 等の部分は並び順に関係が無いので、ゴッソリ無視するとして…。

具体的には、avModels(i, 0) にどのような文字列が、どんな順番で
入っているのでしょうか?


で、これは ListView や ListBox などにも言える事ですが、
コントロール任せのソートは、(バイナリ比較では無く)文字比較なので、
必ずしも期待する並び順とはならない可能性もあります。
(濁点/半濁点、長音記号、半角/全角、大文字/小文字、ひらがな/カタカナの扱いなど)


標準のソート機能で要件を満たせない場合は、自前でソートする事も
検討せねばならないでしょう。

[ツリー表示へ]
タイトルRe^4: TreeViewのソート
記事No12555
投稿日: 2008/06/17(Tue) 10:21
投稿者はじめちゃん
頂いた一層のサンプルですとソートされましたが。
ルートフォルダ以下に階層を付けると
やはりソートされませんね。
仕様でしょうか?回避策は有りませんでしょうか?

Private Sub Command1_Click()
    TreeView1.Sorted = True
    TreeView1.Nodes.Add , , "R0", Text:="Root"
    TreeView1.Nodes.Add "R0", tvwChild, "R11", "aaaa"
    TreeView1.Nodes.Add "R0", tvwChild, "R13", "cccc"
    TreeView1.Nodes.Add "R0", tvwChild, "R12", "bbbb"

    TreeView1.Nodes.Add "R13", tvwChild, "R21", "AAAA"
    TreeView1.Nodes.Add "R13", tvwChild, "R23", "CCCC"
    TreeView1.Nodes.Add "R13", tvwChild, "R22", "BBBB"
End Sub

何方かご指導下さいますよう、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^5: TreeViewのソート
記事No12560
投稿日: 2008/06/17(Tue) 15:00
投稿者魔界の仮面弁士
> 仕様でしょうか?

最後に、
 'TreeView1.Nodes("R0").Expanded = True
 'TreeView1.Nodes("R13").Expanded = True
 TreeView1.Nodes("R0").Sorted = True
 TreeView1.Nodes("R13").Sorted = True
を書き忘れているから、とか。


ヘルプの『Sorted プロパティ (ツリー ビュー コントロール)』の項には、
末尾に「解説」として、
》 Sorted プロパティには、2 とおりの使い方があります。1 つは……
と書かれていますね。(上記サンプルは、そのうちの 2 つ目の方法です)


> 回避策は有りませんでしょうか?

標準機能としては、それぐらいでしょう。
それで問題がある場合には、(先にも書いたように)自前で対処、と。

[ツリー表示へ]
タイトルRe^6: TreeViewのソート
記事No12561
投稿日: 2008/06/17(Tue) 15:15
投稿者はじめちゃん
魔界の仮面弁士様
いつもいつも有難う御座います。

フォルダNode単位でSorted=Trueを設定しなければ。
いけないのですね。

しかし、それだとフォルダとアイテムが一緒にソートされるので
フォルダ群が最初に在って、アイテム群が次に在って。
それぞれソートされているように作りたいので。

結局、自分でソートさせてからAddしていくしかないのですね。
お騒がせしたしました。

[ツリー表示へ]