0

C#でツールストリップコンボボックスに入力マスクを適用する方法を誰かが見つけたのではないかと思っていました。

ドロップダウンボックスにIPアドレスが入力されるので、ユーザーが書き込める内容を制限したいと思います(例:入力できるのは3'。、数字のみなど)。

ですから、誰かが助けてくれるなら、私は本当に感謝します!

前もって感謝します。

編集

デザインが変更されたため、ToolStripComboBoxが必要になりました

4

2 に答える 2

1

KeyUpイベントをキャッチしてから、入力が有効であることを確認してください。そうでない場合は、最後の有効な入力に戻します。おそらく、 Validatingイベントと同様のことをしたいと思うでしょう( CausesValidationがtrueであることを確認してください)。

もう1つのオプションは、MaskedTextBoxを作成し、ドロップダウンメニューのテキストボックス部分を覆うように配置することです。次に、2つのフォームコントロールが同期されたままになるように、イベントを接続する必要があります。

ErrorProviderクラスを調べることもできます。

他にもいくつかの方法がありますが(0.3秒ごとに実行されるタイマーなど)、通常はパフォーマンスが低下するか、保守が困難です。

正規表現コメントの更新
これを行う場合は、正規表現を使用するか、手動で文字列を解析する可能性があります。いずれにせよ、KeyUpイベントとValidatingイベントは、コントロールの検証をチェックする場所です。KeyUpイベントを使用すると、入力時にチェックするオプションが提供され、Validatingイベントを使用すると、コントロールがフォーカスを失ったときに検証できます。どちらを使用するかは、ユーザーエクスペリエンスをどのようにするかによって異なります。

KeyUpイベントを使用して検証しない場合は、最後にキーを押してから5秒後に実行されるタイマーを追加できます。このようにして、エラーを表示するためにコントロールがフォーカスを失う必要はありません。

編集された質問とコメントの更新:質問はユーザー入力のフォーマット方法に関するものであり、リストへの追加方法に関するものではなかったため、イベントを
使用できませんでした。Formatそのため、ソリューションはで、ToolStripComboBoxまたはで機能しませんComboBox

のドキュメントを読んだ後、にToolStripControlHostキャストできる場合があります。そうでない場合は、を使用してフォームにを配置できます。ToolStripComboBoxComboBoxToolStripControlHostComboBox -これは正しくないか不要です。見積もりの​​下の更新を参照してください。

ToolStripControlHostは、ToolStripComboBox、ToolStripTextBox、およびToolStripProgressBarの抽象基本クラスです。ToolStripControlHostは、2つの方法で、カスタムコントロールを含む他のコントロールをホストできます。

  • Controlから派生したクラスを使用してToolStripControlHostを構築します。ホストされているコントロールとプロパティに完全にアクセスするには、Controlプロパティをそれが表す実際のクラスにキャストして戻す必要があります。

  • ToolStripControlHostを拡張し、継承されたクラスのデフォルトコンストラクターで、Controlから派生したクラスを渡す基本クラスコンストラクターを呼び出します。このオプションを使用すると、ToolStripで簡単にアクセスできるように、一般的な制御メソッドとプロパティをラップできます。

ToolStripControlHostクラスを使用して、カスタマイズしたコントロールまたはその他のWindowsフォームコントロールをホストします。

ToolStripItemをカスタマイズするには、ToolStripControlHostから派生し、カスタム実装を作成します。OnSubscribeControlEventsなどのメソッドをオーバーライドして、ホストされたコントロールによって発生したイベントを処理したり、カスタム機能をプロパティに組み込んでホストされたコントロールを拡張したりできます。

更新:ドキュメントによると、のプロパティを介しToolStripComboBoxて基になるにアクセスできます。ComboBoxToolStripComboBoxComboBox

これが、私が通常、コントロールを使用する前にコントロールのドキュメントを読む理由です。わからないかもしれませんが、少なくとも何を探すべきかはわかります。:)

于 2012-09-18T16:45:22.067 に答える
1

次のような Format イベントを作成する必要があります。

    private void comboBox1_Format(object sender, ListControlConvertEventArgs e)
    {
        e.Value = GetFullIpFormat((string)e.Value);
    }

そして、値をフォーマットするためのコードは次のとおりです。

    string GetFullIpFormat(string value)
    {
        string[] ip = new string[4];
        for (int i = 0; i < ip.Length; i++)
        {
            ip[i] = GetIpPart(i, value);
        }
        return string.Format("{0:###}.{1:###}.{2:###}.{3:###}", ip[0], ip[1], ip[2], ip[3]);
    }

    string GetIpPart(int partNumber, string ip)
    {
        string result = "000";
        int iLen = 3;
        ip = ip.Replace(".", "");
        int iStart = partNumber * iLen;
        if (ip.Length > iStart)
        {
            result = ip.Substring(iStart);
            if (result.Length > iLen)
            {
                result = result.Substring(0, iLen);
            }
        }
        return result;
    }

これにより、フォーマットが行われます。または、同じイベントの入力を数値で確認することもできます。これで作業は完了です。コーディングをお楽しみください。:)

于 2012-09-18T17:04:38.980 に答える