>>83
意図しない動作をするときはデバッガでその部分の前にブレークポイントを
置いてステップ実行で動作を確認すると問題点がわかります。

製品版でなく .NET SDK を使っているなら、デバッガはここです。
C:\Program Files\Microsoft.NET\FrameworkSDK\GuiDebug\DbgCLR.exe

うまくいかない理由は、もう確認済みかもしれませんが、
KeyPress イベントはキーを処理する前に呼ばれるイベントなので2度目の
'.' が入力された時点では Text プロパティに '.' はまだ一つしかありません。
e.Handled = true; とするだけでその入力がキャンセルになるので Text から
削除する必要はありません。

あと、case (char)46: は case '.': とも書けます。


派生クラスにイベント処理を実装するなら KeyPress イベントではなく
OnkeyPress メソッドをオーバーライドする方法もあります。


protected override void OnKeyPress( KeyPressEventArgs e )
{
    switch ( e.KeyChar )
    {
        case '.':
            if ( this.Text.IndexOf( '.' ) >= 0 )
            {
                e.Handled = true;
            }
            break;
    }

    base.OnKeyPress( e );
}