2

アプリケーションにユーザーフォームがあります。一部のフィールドが検証されます。フィールドに間違った値がある場合、このコントロールに赤い境界線が描画されます。Paintこのコントロールのイベントを処理することで作成されます。これらのクラス オブジェクトからイベントを取得するためにTextFieldandを拡張しました。クラスに問題があります。イベントを適切に発生させますが、呼び出しますDateTimePickerPaintNumericUpDownPaint

ControlPaint.DrawBorder(e.Graphics, eClipRectangle, Color.Red, ButtonBorderStyle.Solid);

はまったく何もしません。アイデアや提案はありますか?それを行う方法が見つからない場合は、NumericUpDownコントロールを保持するパネルを追加し、その背景色を変更します。

ハンドラーがイベントに接続されるたびに、それを再描画するためPaintに呼び出しますcontrol.Invalidate()

4

1 に答える 1

4

これを試して:

public class NumericUpDownEx : NumericUpDown
{
    bool isValid = true;
    int[] validValues = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (!isValid)
        {
            ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);
        }
    }

    protected override void OnValueChanged(System.EventArgs e)
    {
        base.OnValueChanged(e);

        isValid = validValues.Contains((int)this.Value);
        this.Invalidate();
    }
}

値が10進数ではなくint型であると仮定します。あなたの有効性チェックはおそらく異なるでしょうが、これは私にとってはうまくいきました。新しい値が定義された有効な値に含まれていない場合、NumbericUpDown 全体に赤い境界線が描画されます。

コツは、base.OnPaintを呼び出した後に必ず境界線の描画を行うことです。そうしないと、境界線が上書きされます。OnPaint メソッドをオーバーライドすると、ペイントの順序を完全に制御できるため、ペイント イベントに割り当てるよりも、NumericUpDown から継承する方がよい場合があります。

于 2013-02-09T00:07:25.767 に答える