アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。
VB.NETのリストボックスの並べ替え方法で
ListBox1.Sorted = True
で並べ替えると、例えばアイテムに1~1000の数字を登録
してあった場合
1
10
100
1000
101
102



109
11
110
111


というようにあまり好ましい順番に並び替えしてくれないのですが、
良い並べ替え方法があったら教えて頂きたいです。
よろしくお願いいたします。

A 回答 (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
    • good
    • 0

数字を登録する際に文字列に変換して 桁数を合わせてみてはいかがでしょう



for n = 1 to 1000
  ListBox1.Items.Add( n.ToString().PadLeft(4) )
next

これなら Sortedプロパティが TrueでもFalseでも同じ結果が得られますよ
    • good
    • 0

間違い一箇所発見orz


'誤
'Public Sub Append()
'正
Public Sub Append(Sender As Object, e As System.EventArgs)

'SharpDevelopでOption Strict Onをデフォルトにする方法がわからん。
'調べてないだけだけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!