• ベストアンサー

リストボックスの並べ替え (VB.NET)

こんばんは。 VB.NETのリストボックスの並べ替え方法で ListBox1.Sorted = True で並べ替えると、例えばアイテムに1~1000の数字を登録 してあった場合 1 10 100 1000 101 102 ・ ・ ・ 109 11 110 111 というようにあまり好ましい順番に並び替えしてくれないのですが、 良い並べ替え方法があったら教えて頂きたいです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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)
回答No.3

数字を登録する際に文字列に変換して 桁数を合わせてみてはいかがでしょう for n = 1 to 1000   ListBox1.Items.Add( n.ToString().PadLeft(4) ) next これなら Sortedプロパティが TrueでもFalseでも同じ結果が得られますよ

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

間違い一箇所発見orz '誤 'Public Sub Append() '正 Public Sub Append(Sender As Object, e As System.EventArgs) 'SharpDevelopでOption Strict Onをデフォルトにする方法がわからん。 '調べてないだけだけど。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リストボックス

    VB.NETでWindowsMobile5.0の開発をしてます。 リストボックスのアイテムを削除するとアイテムのフォーカスが消えてしまいます。 続けて削除としたいのですがリストボックス内のアイテムにフォーカスを移すにはどうすれば良いのでしょうか。 初歩的な質問で申し訳ありませんがよろしくお願いします。

  • テキストファイルの読み込みとリストボックスへの反映

    VB初心者です。VB2008を使用しています。 2のリストボックス(listbox1,listbox2)があり、 listbox1には("1","2")、listbox2には("A","B")という値がはいっています。 このデータをテキストファイル(test.txt)に次のように保存します [listbox1] 1 2 [listbox2] A B ここまでは出来ました。 そこで質問です。 保存したこれらの値をそれぞれのリストボックスに読み込ませたいのですが、 どのようにすればよいでしょうか。 実行ファイルとテキストファイルは同じフォルダ(c:\testprogram)に入っています。 うまく伝えられませんがよろしくお願い致します。

  • リストボックスの番号を指定して関数を実行するにはVB.NET

    VB.NET Framework 1.1環境なのですが、 リストボックスから例えば文字列を検索して、見つかったら その行数を返すという関数で、リストボックスが沢山ある場合に リストボックスの番号も関数の呼び出しに指定して、 関数部分をどのリストボックスでも対応できるように したいのですが、どのような方法でやれば良いでしょうか? Function SearchStr(ByVal i As Integer, ByVal str As String) As Integer End Sub という関数を呼び出す際に res = SearchStr(1,"文字列") というようにすると、ListBox1から文字列を検索したいという意味 なのですが、可能でしょうか? 検索は例えばなので、 res = SearchStr(1,10) とすると res = ListBox1.Items(10) と同じ内容が返るような数字をリストボックスの指定に使う 書き方を教えて頂きたいです。 よろしくお願い致します。

  • リストボックスの1行目を選択状態にする

    リストボックス 何も選択していないのなら、1行目を選択状態にする というようにするにはどうすればいいでしょうか? 今は無理やり Sub test() If IsNull(Sheets("Sheet2").ListBox1.Value) = True Then Sheets("Sheet2").ListBox1.Value = "a" End If End Sub としていますが、 「リストボックスの1行目を選択状態にする」 にはどうすればいいですか? リストボックスがどの業も選択してない時に、 画像のようにしたいです。

  • リストボックスの並び替え

    VB.NETについて質問です。 ボタン1をクリックしたら、テキストボックス1に入力した文字を、リストボックス1に登録するとします。 この時、名前、年齢を入力します。 これを、ボタン2、3、をクリックしたら、リストボックスの内容を、名前順、年齢順に並べ替えたいです。 どうしても分かりません。 並べ替えるにはどうしたらいいでしょうか?

  • VB6.0 リストボックス

    VB6.0で3つのリストボックスに関連性を持たせたいと思っています。 Private Sub lstBox_Click() Dim intLstIndex As Integer intLstIndex = lstA.ListIndex If (lstA.Selected(intLstIndex)) Then lstB.Selected(intLstIndex) = True lstC.Selected(intLstIndex) = True Else lstB.Selected(intLstIndex) = False lstC.Selected(intLstIndex) = False End If End Sub 以上のように、どれか一つのリストボックスがクリックされたら他のリストボックスの同じ行がtrueになるようにしています。 しかしこれでは件数が増えた場合、選択された行が揃わなくなる場合があり非常に見栄えが悪くなります。 リストボックスでなくともかまわないのですが、このように三つの項目に関連性をもたせることはできませんでしょうか。

  • エクセルVBA リストボックスの使い方について・・・

    Private Sub CommandButton1_Click() ListBox1.RowSource = "sheet1!A1:A8" End Sub 上記にあるようにA1~A8にあるデータをリストボックスに表示させたいのです・・・ でも上記方法だと、コマンドボタンをクリックしないと、リストボックスに登録できないですよね・・・ 自分的にはリストボックスが立ち上がった状態ですぐにA1~A8のデータをリストボックス内に表示させたいのですが、そのようなことが出来るのでしょうか? 宜しくお願い致します。

  • リストボックスの使い方で…

    VB2005で開発をしております。 リストボックスに品目名を表示し、選択した品目名の品目コードをDBに登録したいと思っています。 ただ、品目名の裏で品目コードを保持しておく方法がわかりません。 なにか良い方法があれば教えていただきたいです。

  • 複数リストボックスの連動について

    複数リストボックスの連動についてお聞きします。 エクセル2003、VBAのユーザーフォームのリストボックスになります。 VBAに関わらずプログラミング全般初心者で恐縮ですが よろしくご指導ください。 毎月の明細から 地域を分類軸に、そこに含まれる支店を、地域をまたいで複数選択ができるリストボックスの作成をしたいと考えてます。 ListBox1(地域),ListBox2(支店)に値を重複無しに、組み合わせを表示させるまではできたのですが、 ListBox1(地域)の選択を解除した後に、再び選択すると、 ListBox2(支店)の値が重複して表示されてしまいます。 ネットで知恵を探したのですが、 ListBox1のクリックイベント時に、ListBox2の値を消す しか見つからず、自分の課題がどうしても解決できません。 どのような方向性で考えれば、解決できるのか教示いただきたいです。 自分としては、ListBox1の選択を解除したときに、 対応するListBox2が消えればと考えましたが・・・全くうまくいきません。 もし、自分の考えが的外れでしたら、正しい考え方をお教えいただきたいです。 考えが妥当であれば、どういう記述をすべきなのか、 教授願いたいです。 よろしくお願いします。

  • リストボックスの複数選択時のダブルクリックについて

    リストボックスをMultiExtendedで設定してあり、 複数を選択した状態でその選択されているどれかのアイテムを ダブルクリックすると選択されている全てのアイテム(番号)を 取得したいのですが、どのようにしたらできるでしょうか。 ListBox1_SelectedIndexChangedで複数選択アイテム番号を記憶させて 次にダブルクリックした際に、そのアイテム番号が記録の中の番号に 含まれていれば、記録してある番号のアイテムを全部取得して、 その後で、その記録されていた番号のアイテムを全部選択状態に 設定すればダブルクリックしたように見えると思ったのですが、 ダブルクリックの一回目のクリックでListBox1_SelectedIndexChanged イベントが 発生してしまい、複数選択の記録が消えてしまいます。 フラグを立てたりと色々試しているのですが、どうもうまく動作してくれません。 良い方法やヒントがありましたら、ご教授頂けると幸いです。 VB.NET2003、Framework1.1環境です。