Im Textfeld nur führendes Minus, Zahlen, Komma und best. Tasten erlauben

using System.Globalization;

// nur Eingabe von führendem Minus, Zahlen, ein Dezimaltrennzeichen und Backspace in der Textbox zulassen
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (sender is TextBox)
    {
        TextBox tb = sender as TextBox;

        // Merker für Bedingungen
        bool bOk = true;

        // wenn das Eingabezeichen ein kulturunabhängiges Dezimaltrennzeichen ist
        if (e.KeyChar.ToString() == NumberFormatInfo.InvariantInfo.NumberDecimalSeparator)
        {
            // überprüfen, ob in der Textbox schon ein Dezimaltrennzeichen steht,
            // um Doppelungen zu vermeiden
            bOk = (tb.Text.IndexOf(NumberFormatInfo.InvariantInfo.NumberDecimalSeparator) < 0);
        }

        // wenn das Eingabezeichen ein führendes Minus ist
        if (e.KeyChar.ToString() == NumberFormatInfo.InvariantInfo.NegativeSign)
        {
            // überprüfen, ob in der Textbox schon ein führendes Minus steht,
            // um Doppelungen zu vermeiden
            bOk = ((tb.SelectionStart == 0) && (tb.Text.IndexOf(NumberFormatInfo.InvariantInfo.NegativeSign) < 0));
        }

        if (bOk)
        {
            // Liste mit erlaubten Zeichen, in diesem Fall
            // führendes Minus, Zahlen, Dezimaltrennzeichen, Backspace
            string sChars = NumberFormatInfo.InvariantInfo.NegativeSign + "0123456789" + NumberFormatInfo.InvariantInfo.NumberDecimalSeparator + "\b";

            // testen, ob das Zeichen erlaubt ist (in der Liste vorhanden ist)
            e.Handled = (sChars.IndexOf(e.KeyChar) < 0);
        }
        else
        {
            // sonst Eingabezeichen verwerfen
            e.Handled = true;
        }
    }
}

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;
    }
}