リストビューの項目を消した時に空欄を失くしたい

解決


のんたん  2004-07-30 02:55:36  No: 84834  IP: [192.*.*.*]

先程リストビューについて質問した者です。
私ではない方が解決と更新してしまいました。
通りすがりのネコさんありがとうございます。
できればマウスでクリックしているリストビューの項目を削除し、
その下の項目が一つずつ上に詰められ、
空欄ができないようにしたいのですが、
どなたかご指導ください。
リストビューの項目の数が決まっていなくて、ある項目を削除した時
その空欄に一つ下の項目が一つずつ上がっていくようにしたいのですが、
以下のコードだと最後の空白行の処理でエラーが起きます。
どなたかいい方法をご存知ではないでしょうか?
Dim i As Integer
For i = 1 To 30 Step 1 '本当は何個か不定ですが30にしておきました。
If frmMain.lstv.ListItems(i).Text = " " Then
    If frmMain.lstv.ListItems(i + 1).Text = " " Then Exit For
       frmMain.lstv.ListItems(i).Text =
                             frmMain.lstv.ListItems(i + 1).Text
       frmMain.lstv.ListItems(i).SubItems(1) = 
                            frmMain.lstv.ListItems(i + 1).SubItems(1)
    End If
Next

編集    削除
通りすがりのネコ  2004-07-30 03:13:54  No: 84835  IP: [192.*.*.*]

選択しているアイテムのインデックス
  frmMain.lstv.SelectedItem.Index

リストビューの項目数
  frmMain.lstv.ListItems.Count

などが取得できます。あとは、このインデックスを用いてやれば...

編集    削除
のんたん  2004-07-30 04:17:55  No: 84836  IP: [192.*.*.*]

通りすがりのネコさんのからお教え頂いたとおり
frmMain.lstv.ListItems.Countを使って以下のコードで
うまくいきました。二度も教えて頂いて本当にありがとうございました。

Private Sub cmdSakujoOK_Click()

frmMain.lstv.SelectedItem.Text = " "
frmMain.lstv.SelectedItem.SubItems(1) = " "

Dim i As Integer
Dim u As Integer
u = frmMain.lstv.ListItems.Count - 1
For i = 1 To u Step 1
    If frmMain.lstv.ListItems(i).Text = " " Then
       frmMain.lstv.ListItems(i).Text = 
                                  frmMain.lstv.ListItems(i + 1).Text
       frmMain.lstv.ListItems(i).SubItems(1) =
                           frmMain.lstv.ListItems(i + 1).SubItems(1)
       frmMain.lstv.ListItems(i + 1).Text = " "
       frmMain.lstv.ListItems(i + 1).SubItems(1) = " "
       
    End If
Next

編集    削除
通りすがりのネコ  2004-07-30 21:48:04  No: 84837  IP: [192.*.*.*]

Private Sub cmdSakujoOK_Click()
  if frmMain.lstv.SelectedItem.Index > 0 then
    frmMain.lstv.ListItems.Remove frmMain.lstv.SelectedItem.Index
  endif
End Sub

のように使うのだと思っていましたが...
せっかくなので、もう一言。

リストビューへの項目の追加ってAddですよね。
その場合、逆の削除は普通はRemoveです。
> frmMain.lstv.SelectedItem.Text = " "
> frmMain.lstv.SelectedItem.SubItems(1) = " "
は、項目を削除しているのではなくて、項目の文字を空白にしているだけなので、
frmMain.lstv.ListItems.Count  はいつまで経っても減少しません。
つまり、項目を削除したことにはならないと思うのですが...
マウスで削除リストビューの下のほうをクリックしたら、
空欄が選択されると思います。
(わざと項目を空白にしておきたい理由があるのでしたらごめんなさい)

編集    削除
のんたん  2004-07-31 01:38:15  No: 84838  IP: [192.*.*.*]

通りすがりのネコさんの言うとおりです。
初心者なのでRemoveの使い方が分からず、空白にして1行上げるって
処理をめざしてしまい、あんなに無駄に長いコードを書くことになって
しまいました。
通りすがりのネコさんの方法だと単純に
Private Sub cmdSakujoOK_Click()

    frmMain.lstv.ListItems.Remove frmMain.lstv.SelectedItem.Index

Me.Hide

End Sub
追加指導ありがとうございました。
でできました。

編集    削除