This is just a simple example of how to edit Sub Items in ListView. If you need such things frequently then just create an user control inheriting ListView and incorporate the idea, you can read column names dynamically and create context menu as shown in the example, you can find source project at the bottom of this post, please download it. I am providing 2 methods

1. Using ContextMenu

   Private WithEvents EditBox As New TextBox

    Private WithEvents EditMenu As New ContextMenu

    Private SelectedItem As ListViewItem

    Private EditingcolumnIndex As Integer = 0

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        For i As Integer = 1 To ListView1.Columns.Count - 1

            Dim EditCoulmn1 As New MenuItem(String.Format("Edit {0}", ListView1.Columns(i).Text), AddressOf EditMenu_click)

            EditMenu.MenuItems.Add(EditCoulmn1)

        Next

    End Sub

 

    Private Sub EditMenu_click(ByVal S As Object, ByVal e As EventArgs)

        Dim clickedmenu As MenuItem = CType(S, MenuItem)

        EditingcolumnIndex = (From c As ColumnHeader In ListView1.Columns Where c.Text = clickedmenu.Text.Replace("Edit ", String.Empty) Select c).First.Index

        EditBox.Bounds = SelectedItem.SubItems(EditingcolumnIndex).Bounds

        EditBox.Text = SelectedItem.SubItems(EditingcolumnIndex).Text

        EditBox.Visible = True

        EditBox.Select()

    End Sub

    Private Sub Editbox_Leave() Handles EditBox.Leave

        SetValues()

    End Sub

    Private Sub EditBox_KeyUp(ByVal s As Object, ByVal e As KeyEventArgs) Handles EditBox.KeyUp

        If e.KeyCode = Keys.Enter Then

            SetValues()

        ElseIf e.KeyCode = Keys.Escape Then

            EditBox.Visible = False

        End If

    End Sub

    Private Sub SetValues()

        SelectedItem.SubItems(EditingcolumnIndex).Text = EditBox.Text

        EditBox.Visible = False

    End Sub

    Private Sub ListView1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseClick

        Dim item = ListView1.GetItemAt(e.X, e.Y)

        If item IsNot Nothing Then

            If e.Button = Windows.Forms.MouseButtons.Right Then

                SelectedItem = item

                EditMenu.Show(ListView1, e.Location)

            End If

        End If

        EditBox.Visible = False

        ListView1.Controls.Add(EditBox)

    End Sub

2. HitTest Method

Public Class Form1

    Private WithEvents EditBox As New TextBox

    Private SelectedItem As ListViewItem.ListViewSubItem

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        EditBox.Visible = False

        ListView1.Controls.Add(EditBox)

        ListView1.FullRowSelect = True

    End Sub

Private Sub Editbox_Leave() Handles EditBox.Leave

        SetValues()

    End Sub

    Private Sub EditBox_KeyUp(ByVal s As Object, ByVal e As KeyEventArgs) Handles EditBox.KeyUp

        If e.KeyCode = Keys.Enter Then

            SetValues()

        ElseIf e.KeyCode = Keys.Escape Then

            EditBox.Visible = False

        End If

    End Sub

    Private Sub SetValues()

        SelectedItem.Text = EditBox.Text

        EditBox.Visible = False

    End Sub

    Private Sub ListView1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseClick

        Dim info As ListViewHitTestInfo = ListView1.HitTest(e.X, e.Y)

        If info.Item IsNot Nothing AndAlso info.SubItem.Bounds.X > 10 Then

 

            EditBox.Bounds = info.SubItem.Bounds

            EditBox.Text = info.SubItem.Text

            SelectedItem = info.SubItem

            EditBox.Visible = True

            EditBox.Select()

 

 

        End If

    End Sub

End Class

 

 

 

EditSubItemHitTest.zip (118.95 kb)

 

EditSubItem.zip (121.08 kb)