2

ユーザーが NumericUpDown コントロールに数値を入力できるアプリをプログラムしたいと考えています。実行時に決定される数 (範囲など) にはいくつかの条件があります。ユーザーにフィードバックを提供するために、少なくとも 1 つの条件が満たされない場合に、NumericUpDown の BackColor を赤に変更しました。これまでのところ、期待どおりに機能しています。

ここで、数値が「間違っている」理由を説明するために、ツールチップを NumericUpDown に追加したいと思いました。イベント NumericUpDown_BackColorChanged を使用してテキストを調整すると、イベントが「トリガー」されません。何故ですか?

Hans Passantがここここで述べているように、NumericUpDown の複合文字と関係があると思います。しかし、よくわかりません。事前に TY にお問い合わせください。

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        if (numericUpDown1.Value == 42)
        {
            numericUpDown1.BackColor = Color.Red;
        }
        else
        {
            numericUpDown1.BackColor = System.Drawing.SystemColors.Window;
        }
    }

private void numericUpDown1_BackColorChanged(object sender, EventArgs e)
    {
        //something epic should happen
        //but somehow my program never reaches these lines :(
    }
4

2 に答える 2

4

NumericUpDown.BackColorプロパティ セッターが実際に呼び出されないことを確認しましたOnBackColorChanged(少なくとも .NET 4.0 では)。

これは、BackColorプロパティがオーバーライドされて内部の複合コントロールUpDownBaseも設定され、おそらく誰かが基本実装を呼び出すのを忘れたためだと思います (ここで WinForms の達人から聞きたいです)。BackColorNumericUpDown

できることは、プロパティFixedNumericUpDownを継承しNumericUpDownてオーバーライドするコントロールを作成することです。BackColor

public Color BackColor
{
    override set
    {
        base.BackColor = value;
        OnBackColorChanged(EventArgs.Empty);
    }
}
于 2013-01-02T14:03:05.230 に答える
0

提案:これを行うには、ツールボックスからドラッグ アンド ドロップしてErrorProviderを追加します。

コードを次のように置き換えます。

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    { 
        errorProvider1.Clear();

        if (numericUpDown1.Value == 42)
        {
            numericUpDown1.BackColor = Color.Red;
            errorProvider1.SetError(numericUpDown1, "Select another number");
        }
        else
        {
            numericUpDown1.BackColor = System.Drawing.SystemColors.Window;
        }
    }
于 2013-01-02T13:31:29.550 に答える