- ベストアンサー
リストボックスの並べ替え (VB.NET)
こんばんは。 VB.NETのリストボックスの並べ替え方法で ListBox1.Sorted = True で並べ替えると、例えばアイテムに1~1000の数字を登録 してあった場合 1 10 100 1000 101 102 ・ ・ ・ 109 11 110 111 というようにあまり好ましい順番に並び替えしてくれないのですが、 良い並べ替え方法があったら教えて頂きたいです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Class Q3897213A Inherits System.Windows.Forms.Form Private CustomList1 As New NumericSortedList Private TextBox1 As New System.Windows.Forms.TextBox Private Button1 As New System.Windows.Forms.Button Private Button2 As New System.Windows.Forms.Button Public Sub New() Me.Width = 800 Me.Height = 600 CustomList1.Width = 700 CustomList1.Height = 400 CustomList1.Top = 0 CustomList1.Left = 25 TextBox1.Width = 100 TextBox1.Height = 20 TextBox1.Top = 500 TextBox1.Left = 500 Button1.Width = 100 Button1.Height = 20 Button1.Top = 550 Button1.Left = 450 AddHandler Button1.Click,AddressOf Append Me.Controls.Add(CustomList1) Me.Controls.Add(TextBox1) Me.Controls.Add(Button1) End Sub Public Sub Append() CustomList1.Items.Add(TextBox1.Text) TextBox1.Clear 'SortedをFalseからTrueに変更した時にソートされるらしいので回りくどいけど。 CustomList1.Sorted = False CustomList1.Sorted = True End Sub Shared Sub Main Dim Q3897213A1 As New Q3897213A Q3897213A1.ShowDialog End Sub End Class Class NumericSortedList Inherits System.Windows.Forms.ListBox Protected Overrides Sub Sort() 'ListBoxはalphabetical sortみたいなので 'MSDN Libraryの記述どおり,Sortメソッドをオーバーライドしたクラスを自作 'ソーティングアルゴリズムの負荷や速度については検討してない。 '何故かこれのバグ取りにかなり時間が掛かったため。基本的なものなはずなんだけどなあ・・・ 'デリゲート使えるかもしれないけどよくわからんので放置。 If Me.Items.Count > 1 Then For i As Integer = 0 To Me.Items.Count - 2 Dim swapped As Boolean = false Dim current As Integer = Integer.Parse(Me.Items(i).ToString) For j As Integer = i + 1 To Me.Items.Count - 1 If Integer.Parse(Me.Items(j).ToString) > current Then For k As Integer = i + 1 To j - 2 Me.Items( k - 1 ) = DirectCast(Me.Items(k),Object) Next Me.Items(j - 1) = DirectCast(current,Object) swapped = True Exit For End If Next System.Console.WriteLine(swapped) If swapped = False Then For k As Integer = i + 1 To Me.Items.Count - 1 Me.Items( k - 1 ) = DirectCast(Me.Items(k),Object) Next Me.Items(Me.Items.Count - 1) = DirectCast(current,Object) End If swapped = False Next End If End Sub End Class
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
数字を登録する際に文字列に変換して 桁数を合わせてみてはいかがでしょう for n = 1 to 1000 ListBox1.Items.Add( n.ToString().PadLeft(4) ) next これなら Sortedプロパティが TrueでもFalseでも同じ結果が得られますよ
- himajin100000
- ベストアンサー率54% (1660/3060)
間違い一箇所発見orz '誤 'Public Sub Append() '正 Public Sub Append(Sender As Object, e As System.EventArgs) 'SharpDevelopでOption Strict Onをデフォルトにする方法がわからん。 '調べてないだけだけど。