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)