1

このコードを使用してリストビューアイテムを右クリックすると、列のインデックスを探しています。

Private Sub Source_lvArticles_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Source_lvArticles.MouseDown
    If e.Button = System.Windows.Forms.MouseButtons.Right Then
        Sources_RightClickedCol = 0

        Dim info As ListViewHitTestInfo = Source_lvArticles.HitTest(e.X, e.Y)
        Sources_RightClickedCol = info.Location
    End If
End Sub

右クリックしているアイテムのテキスト(info.Subitem.Text)を見つけることができますが、その列インデックスが見つかりません...

4

4 に答える 4

3

「列」をクリックするためのはるかに簡単な方法があります。

Private Function GetSubItemIndexAt(x As Integer, y As Integer) As Integer
    ' get HitTextinfo for X,Y
    Dim ht As ListViewHitTestInfo = myLV.HitTest(x, y)

    If ht.Item IsNot Nothing Then
        ' use built in method to get the index
        Return ht.Item.SubItems.IndexOf(ht.SubItem)
    End If

    Return -1           ' (semi) universal not found indicator

End Function

インデックス0はItemまたはLabel領域を参照することに注意してください。

唯一の注意点は、HitTest実際のアイテムがある場合にのみ機能することです。下の空白領域などのアイテム以外の領域をクリックすると、そのXYによって操作するアイテムがなくなります。

于 2015-03-04T17:13:43.260 に答える
2

残念ながら、Alexによって提供された上記のコードでは、行の複数のサブアイテムに同じテキスト値が含まれている場合、左端の最初の列インデックスが選択される危険性があります。より良い方法は、以下の関数をコピーすることです。これは、マウスポインターのX値を使用し、それを列の右の値と比較します。Xは、ループカウントに整数がある時点を超えます。

Private Function GetColumnIndex(ByVal lvw As ListView, ByVal MouseX As _
Integer) As Integer

    Dim result As Integer = 0

    'Get the right and width pixel values of all the columns 
    Dim ColW As New List(Of Integer)
    Dim Index As Integer = 0


    For Each col As ColumnHeader In lvw.Columns
        ColW.Add(col.Width)
        Dim X As Integer = 0
        For i As Integer = 0 To ColW.Count - 1
            X += ColW(i)
        Next

        'Once you have the rightmost values of the columns 
        'just work out where X falls in between

        If MouseX <= X Then
            result = Index
            Exit For
        End If

        Index += 1

    Next

    Return result
End Function
于 2015-02-17T17:33:46.687 に答える
0

私が自分の列インデックスを理解するために何をしたのか疑問に思っている人のために...それはあまりエレガントではありませんが、機能します。

Private Sub Source_lvArticles_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Source_lvArticles.MouseDown
    If e.Button = System.Windows.Forms.MouseButtons.Right Then
        Sources_RightClickedCol = 0

        Dim info As ListViewHitTestInfo = Source_lvArticles.HitTest(e.X, e.Y)
        Dim SubItem As String = info.SubItem.Text

        For Each item As ListViewItem In Source_lvArticles.Items
            Dim i As Integer = 1
            Dim found As Boolean = False
            For Each s As ListViewItem.ListViewSubItem In item.SubItems
                If s.Text = SubItem Then
                    Sources_RightClickedCol = i
                    found = True
                    Exit For
                End If
                i += 1
            Next
            If found Then Exit For
        Next
    End If
End Sub

これは、リストビューの各行の各サブアイテムを調べて、列インデックス(i)のカウントを保持します。現在のサブアイテムのテキストをHitTestによって検出されたテキストと比較します

于 2013-03-26T16:52:54.953 に答える
0

subitem.tagプロパティを使用して、リストビューにデータを入力しているときに列に関する情報を保存し、後でhittest。(eX、eY).SubItem.tagを使用してこの情報を取得することもできます。

于 2019-03-20T00:52:53.897 に答える