リストボックスでよく使用する設定集(その2)(9個) (SNo.101) 1.指定行を削除する 2.選択されている項目を削除する 3.すべての項目を選択状態にする 4.すべての項目の選択状態を解除する 5.選択されている項目数を取得する 6.処理中の再描画を抑制する(項目を高速に書き込む) 7.クリック毎に昇順・降順に並べ替える 8.複数選択されている項目を高速に削除する |
|
使用コントロール | Button1 〜 Button8 ListBox1 |
その他条件 | WindowsXP(Vista) Visual Basic 2005(VB2008) |
1.指定行を削除する
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click '指定の行を削除する(4行目を削除します) ListBox1.Items.RemoveAt(3) End Sub |
|
2.選択されている項目を削除する Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click '選択されている項目を削除する ListBox1.Items.Remove(ListBox1.SelectedItem) End Sub |
|
3.すべての項目を選択状態にする Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click 'すべての項目を選択状態に設定(データ件数が少ない場合はこちらが簡単) Dim i As Integer For i = 0 To ListBox1.Items.Count - 1 ListBox1.SetSelected(i, True) Next '項目が多くて時間がかかるようならWin32 API の使用を検討して下さい。 End Sub |
|
4.すべての項目の選択状態を解除する Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click 'すべての選択状態を解除する ListBox1.ClearSelected() End Sub |
|
5.選択されている項目数を取得する Private Sub Button5_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button5.Click '選択されている項目数を取得する Debug.WriteLine(ListBox1.SelectedItems.Count) End Sub |
|
6.処理中の再描画を抑制する(項目を高速に書き込む) Private Sub Button6_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button6.Click '処理中コントロールの再描画を抑制 Dim sTime As DateTime Dim eTime As DateTime '------------------------------------------------------------------ ListBox1.Items.Clear() sTime = Now For i As Integer = 0 To 1000 ListBox1.Items.Add(CStr(i).PadLeft(4, " ") & " 番目のデータです") Next i eTime = Now MessageBox.Show(eTime.Subtract(sTime).TotalSeconds & " 秒かかりました。") '結果 パフォーマンスの公表は規約違反のようだから、各自測定して下さい 秒 '------------------------------------------------------------------------------ ListBox1.Items.Clear() sTime = Now ListBox1.BeginUpdate() 'コントロールを再描画しないようにする。 For i As Integer = 0 To 1000 ListBox1.Items.Add(CStr(i).PadLeft(4, " ") & " 番目のデータです") Next i ListBox1.EndUpdate() 'コントロールの描画を再開する。 eTime = Now MessageBox.Show(eTime.Subtract(sTime).TotalSeconds & " 秒かかりました。") '結果 びっくりするほど早い 秒 '------------------------------------------------------------------------------ ListBox1.Items.Clear() sTime = Now ListBox1.Visible = False '一旦非表示(VB6.0 の時のように) For i As Integer = 0 To 1000 ListBox1.Items.Add(CStr(i).PadLeft(4, " ") & " 番目のデータです") Next i ListBox1.Visible = True '表示 eTime = Now MessageBox.Show(eTime.Subtract(sTime).TotalSeconds & " 秒かかりました。") '結果 あまり変らない 秒 '------------------------------------------------------------------------------ End Sub |
|
7.クリック毎に昇順・降順に並べ替える (2) Private Sub Button7_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button7.Click 'クリック毎に昇順・降順に並べ替える ArrayList.Adapter(ListBox1.Items).Reverse() ListBox1.Sorted = True End Sub 通常は昇順にしかソートされないのだが、データを配列に入れ、要素の順序を反転する事で 降順のソートを実現している。 他の事を試している時に、偶然発見したもので、このような使い方が許されるのかは定かでない。 件数が多いと処理速度が落ちるのでどうかと思うが、1000件程度なら問題がないようです。 |
|
8.複数選択されている項目を高速に削除する Private Sub Button8_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button8.Click '複数選択されている項目を削除(総当りしないので高速に処理できます) For i As Integer = ListBox1.SelectedIndices.Count - 1 To 0 Step -1 ListBox1.Items.RemoveAt(ListBox1.SelectedIndices(i)) Next End Sub |
|
テスト用データの表示 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load With ListBox1 .Items.Add("わをん") .Items.Add("かきくけこ") .Items.Add("さしすせそ") .Items.Add("たちつてと") .Items.Add("なにぬねの") .Items.Add("はひふへほ") .Items.Add("まみむめも") .Items.Add("や ゆ よ") .Items.Add("らりるれろ") .Items.Add("あいうえお") End With End Sub |