C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

リストビューのアイテムの序列について。


(過去ログ 8 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■8528 / inTopicNo.1)  リストビューのアイテムの序列について。
  
□投稿者/ ハロルド 二等兵(2回)-(2006/11/26(Sun) 02:53:05)

分類:[VB.NET] 


分類:[VB.NET] 

VB.NET 2005 です。

ListView.View = System.Windows.Forms.View.Details
ListView.MultiSelect = True

のListViewコントロールのItems()内の序列に関してなのですが、

Ctrlキー + ↑、Ctrlキー + ↓ を押すと
選択されている行が一行ずつ上下に移動できるように作っております。

現状では、変更後の各ListViewItemのIndexを最初に計算して、
Dictionary(Of ListViewItem,Integer) に突っ込んで
それをICompareインターフェースを実装したクラスに渡して内部で比較
こういう感じでまぁこれはこれでできたのですが、

なんつーか、そもそもICompareで比較する前の段階で
既に序列が確定しているのにもかかわらず
それを反映させるためにわざわざCompareさせているわけなのですが
もっとオーバーヘッドの少ない方法ってないですかね?

ちなみに

Dim temp0 As ListViewItem
Dim temp1 As ListViewItem
temp0 = ListView1.Items(0)
temp1 = ListView1.Items(1)
ListView1.Items(0) = New ListViewItem()
ListView1.Items(1) = temp0
ListView1.Items(0) = temp1

こんな感じで入れ替えるようなのも試してみたのですが、
これは非常に時間がかかってしまいました・・・・orz

何かいい方法あればお願いします。

0
引用返信 編集キー/
■8530 / inTopicNo.2)  Re[1]: リストビューのアイテムの序列について。
□投稿者/ まどか 大将(288回)-(2006/11/26(Sun) 23:24:44)

分類:[VB.NET] 

Compareうんぬんが何のことかさっぱりですが、
非選択の移動対象アイテムをRemoveしてInsertだけでは?
インデックス1,2,3が選択されていて上へ移動する場合
インデックス0をRemoveしてそれをInsert 3。

0
引用返信 編集キー/
■8531 / inTopicNo.3)  Re[2]: リストビューのアイテムの序列について。
□投稿者/ ハロルド 二等兵(3回)-(2006/11/27(Mon) 00:22:13)

分類:[VB.NET] 

まどか様、ご意見ありがとうございます。
なかなかうまく説明できなかったみたいですので小規模なコードでも記載しますね


Private Sub ListView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListView1.KeyDown
Select Case e.KeyData
Case (Keys.Control Or Keys.Up), (Keys.Control Or Keys.Down)
With ListView1.Items
If .Count < 2 Then Return
''If .Count = ListView1.SelectedItems.Count Then Return
''If ListView1.SelectedItems.Count = 0 Then Return

Dim index(.Count - 1) As Integer
'長くなるので中略 index() には変更後の各アイテムのインデックスを計算して入れる
For i As Integer = 0 To .Count - 1 'とりあえず例として全アイテムの序列を反転するようなインデックス
index(i) = .Count - i - 1
Next

Dim dic As New Dictionary(Of Object, Integer)(.Count)
For i As Integer = 0 To .Count - 1
dic.Add(.Item(i), index(i))
Next
ListView1.ListViewItemSorter = New Sorter(dic)
ListView1.ListViewItemSorter = Nothing
End With
End Select
End Sub

Private Class Sorter
Implements System.Collections.IComparer
Private mDictionary As Dictionary(Of Object, Integer)

Friend Sub New(ByRef dic As Dictionary(Of Object, Integer))
mDictionary = dic
End Sub

Friend Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
With mDictionary
Return .Item(x) - .Item(y)
End With
End Function
End Class

で、Remove,Insertでやりますとやたらとリストビューがちらつくのと
項目数が多いと(現状、最大で300行程度なのですが)結構時間がかかっちゃうので、
いろいろ試行錯誤しているところです。
サブアイテムのBackColorとか色変えたりしてるからって言うのもあると思います。
あと、BeginUpdate、EndUpdateは必要に応じて使用しております。

要点をまとめると、任意の序列でListView.Itemsを並べ替える方法
という事になりますかね。。





0
引用返信 編集キー/
■8534 / inTopicNo.4)  Re[3]: リストビューのアイテムの序列について。
□投稿者/ まどか 大将(289回)-(2006/11/27(Mon) 10:11:19)

分類:[VB.NET] 

Sort処理は全件対象なのでその分遅いのでは?
というか選択行を移動するだけではないの?

Private Sub btnUp_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUp.Click

Dim SelectedItem As ListViewItem = Me.ListView1.SelectedItems(0)
Dim SelectedIndex As Integer = objSelectedItem.Index

' 入れ替え先
Dim NewIndex As Integer = SelectedIndex - 1
Dim MovingItem As ListViewItem = Me.ListView1.Items(NewIndex)

With Me.ListView1
.BeginUpdate()
.Items.RemoveAt(NewIndex)
.Items.Insert(SelectedIndex, MovingItem)
.Items(NewIndex).Selected = True
.Items(NewIndex).Focused = True
.Items(NewIndex).EnsureVisible()
.EndUpdate()
End With

End Sub

> サブアイテムのBackColorとか色変えたりしてるからって言うのもあると思います。

これは描画にとっては致命傷かも。。。
2003ではヘルプにめっちゃリソース食いますって明記されたはずだし。

0
引用返信 編集キー/
■8542 / inTopicNo.5)  Re[4]: リストビューのアイテムの序列について。
□投稿者/ ハロルド 二等兵(4回)-(2006/11/27(Mon) 20:37:18)

分類:[VB.NET] 

いろいろ調べてみたところ、サブアイテムの背景色を設定すると、
項目の追加・削除・色の変更やらを行うとクライアント領域を丸ごと再描画されてしまうみたいですね。
BeginUpdate,EndUpdateも、よく考えてみると今回の場合は
あまり効果がないような気もしてきました。
(再描画のロジック自体は実行されているわけですし)

ん〜〜〜リストビューのWndProcでゴリゴリやるしかないのかな・・・・orz


0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -