Editieren von ListView SubItems mittels TextBox

// auf dem Formular befindet sich ein ListView mit Namen ListView1
// alle Zellen des Formulars können editiert werden
public partial class Form1 : Form
{
    // die Textbox mit der Editiert wird
    private TextBox _tbEdit = new TextBox();
    
    // Verweise auf das ListViewElement
    private ListViewItem.ListViewSubItem _lvSubItemEdit = null;
    
    public frmMain()
    {
        InitializeComponent();

        // Textbox initialisieren
        _tbEdit.Visible = false;
        // Rahmen entfernen, damit die Textbox genau in die Zelle des ListViews passt
        _tbEdit.BorderStyle = BorderStyle.None;
        // Eventhandler für die Textbox hinzufügen
        _tbEdit.Leave += new EventHandler(_tbEdit_Leave);
        _tbEdit.KeyPress += new KeyPressEventHandler(_tbEdit_KeyPress);
        
        // der Form hinzufügen
        this.Controls.Add(_tbEdit);
    }
    
    // Event des ListViews
    // zum Merken des zuletzt angeklickten ListViewItems
    private void ListView1_MouseUp(object sender, MouseEventArgs e)
    {
        ListViewHitTestInfo htInfo = ListView1.HitTest(e.X, e.Y);
        if (htInfo != null)
        {
            if (htInfo.Item != null && htInfo.SubItem != null)
            {
                _lvSubItemEdit = htInfo.SubItem;
            }
        }
    }
    
    // bei Doppelklick auf ein SubItem die Textbox anzeigen
    private void ListView1_DoubleClick(object sender, EventArgs e)
    {
        // Größe anpassen
        _tbEdit.Top = ListView1.Top + _lvSubItemEdit.Bounds.Top + 2;
        _tbEdit.Left = ListView1.Left + _lvSubItemEdit.Bounds.Left + 2;
        _tbEdit.Width = _lvSubItemEdit.Bounds.Width;
        _tbEdit.Height = _lvSubItemEdit.Bounds.Height;
        // Inhalt übergeben
        _tbEdit.Text = _lvSubItemEdit.Text;
        // anzeigen
        _tbEdit.Visible = true;
        _tbEdit.BringToFront();
        _tbEdit.Focus();
    }

    // Event für den Tastendruck im Textfeld
    private void _tbEdit_KeyPress(object sender, KeyPressEventArgs e)
    {
        switch (e.KeyChar)
        {
            case (char)(int)Keys.Escape:
                // bei Escape Eingabe nicht übernehmen
                EndEditing(false);
                break;
            case (char)(int)Keys.Enter:
                // bei Escape Eingabe übernehmen
                EndEditing(true);
                break;
        }
    }

    // Event für das Verlassen des Textfeldes per Maus
    // die Eingabe im Textfeld wird nicht übernommen
    private void _tbEdit_Leave(object sender, EventArgs e)
    {
        EndEditing(false);
    }

    // Aktion beim Verlassen des Textfeldes
    private void EndEditing(bool AcceptChanges)
    {
        if (_lvSubItemEdit != null)
        {
            if (AcceptChanges)
            {
                // bei "Enter", den Text übernehmen
                _lvSubItemEdit.Text = _tbEdit.Text;
            }
        }

        // Textbox ausblenden
        _tbEdit.Visible = false;
    }
}