tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルListViewコントロールの行番号を取得するときにエラーになる
記事No8066
投稿日: 2008/09/03(Wed) 13:41
投稿者pencil
よろしくお願いします。

ListView1_SelectedIndexChangedイベントが起こったときに、その行番号を取得しようとしています。(下記コード)

Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged

        Dim k As Integer
        k = ListView1.SelectedIndices(0) + 1 
        MsgBox(k)

End Sub

1番最初の実行時は行番号を表示しますが、もう一度別の項目を選ぶとエラーになります。

エラー内容:
ArgumentoutofRangeExceptionはハンドルされませんでした。
'0' の InvalidArgument=Value は 'index' に対して有効ではありません。 パラメータ名: index

2行目の代入するところでエラーになります。

ところが、同じ処理を、フォーム上に配置したボタンコントロールより行うと、エラーは出ません。(下記コード)

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Dim k As Integer
        k = ListView1.SelectedIndices(0) + 1
        MsgBox(k)
End Sub

どうしてエラーになってしまうのかわかりません。
よろしくお願いします。

(全コード)
Public Class Form1

    '
    Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged

        Dim k As Integer
        k = ListView1.SelectedIndices(0) + 1
        MsgBox(k)

    End Sub

    'リストビューに項目を設定
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ListView1.Items.Clear()

        Dim item1() As String = {"リンゴ", "果物", "赤"}
        ListView1.Items.Add(New ListViewItem(item1))
        Dim item2() As String = {"メロン", "果物", "緑"}
        ListView1.Items.Add(New ListViewItem(item2))
        Dim item3() As String = {"ピーマン", "野菜", "緑"}
        ListView1.Items.Add(New ListViewItem(item3))
    End Sub

    'ボタンコントロールを押すと、選択された行の行番号を表示
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim k As Integer
        k = ListView1.SelectedIndices(0) + 1
        MsgBox(k)
    End Sub
    
End Class

[ツリー表示へ]
タイトルRe: ListViewコントロールの行番号を取得するときにエラーになる
記事No8068
投稿日: 2008/09/03(Wed) 13:52
投稿者pencil
VB 2008 Express Editionで作業しています。

[ツリー表示へ]
タイトルRe^2: ListViewコントロールの行番号を取得するときにエラーになる
記事No8069
投稿日: 2008/09/03(Wed) 14:42
投稿者KG
SelectedIndexChangedイベントは、Itemからフォーカスが失われた(選択解除)時と、
Itemにフォーカスがあたった時の2回起こるようです。

最初のイベントの際は、選択されているItemがないので、エラーになるのかと思います。

1回目にエラーが起きないのは、選択されているItemがないのでフォーカスが失われる際の
イベントが発生しないからだと思いますよ。

[ツリー表示へ]
タイトルRe^3: ListViewコントロールの行番号を取得するときにエラーになる
記事No8070
投稿日: 2008/09/03(Wed) 14:54
投稿者ダンボ
> SelectedIndexChangedイベントは、Itemからフォーカスが失われた(選択解除)時と、
> Itemにフォーカスがあたった時の2回起こるようです。

そうなんですよね。最初ずいぶん悩みました。
私の場合、対処としてSelectedIndexChangedイベント処理には
 If .SelectedItems.Count <= 0 Then Exit Sub
を入れておき.SelectedItems.Countが0なら選択解除なので何もしないと
しております。

[ツリー表示へ]
タイトルRe^4: ListViewコントロールの行番号を取得するときにエラーになる
記事No8079
投稿日: 2008/09/03(Wed) 19:48
投稿者pencil
ダンボさんに教えていただいたように、
選択されていない時の処理を追加するとうまくいきました。

選択解除の時にもイベントが発生するとは全然気づきませんでした。

とても参考になりました。

[ツリー表示へ]