0

という名前のクラスで、テキスト ボックスの検証メソッドを使用していValidatorsます。検証に失敗したテキストボックスに長方形を描画しようとしています。

このコードを使用しています:

    private void TextBoxStyle(TextBox textBox)
    {
        Graphics graphics = textBox.CreateGraphics();
        Pen redPen = new Pen(Color.Red);

        graphics.DrawRectangle(redPen, textBox.Location.X, textBox.Location.Y, textBox.Width, textBox.Height);
    }

    /// <summary>
    /// Validates TextBoxes for string input.
    /// </summary>
    public bool ValidateTextBoxes(params TextBox[] textBoxes)
    {
        foreach (var textBox in textBoxes)
        {
            if (textBox.Text.Equals(""))
            {
                Graphics graphics = textBox.CreateGraphics();
                Pen redPen = new Pen(Color.Red);

                graphics.DrawRectangle(redPen, textBox.Location.X, textBox.Location.Y, textBox.Width, textBox.Height);

                return false;
            }
        }

        return true;
    }

問題は...長方形が表示されないことです。コードに何か問題がありますか? はいの場合、助けてください。

4

5 に答える 5

1

ユーザーコントロールを書く

  public partial class UserControl1 : UserControl
    {
        private string text;
         private bool isvalid = true;
        public string Text
        {
            get { return textBox.Text; }
            set { textBox.Text = value; }
        }

        public bool isValid
        {
            set
            {
                isvalid = value;
                this.Refresh();
            }
        }

        TextBox textBox = new TextBox();
        public UserControl1()
        {
            InitializeComponent();
            this.Paint += new PaintEventHandler(UserControl1_Paint);
            this.Resize += new EventHandler(UserControl1_Resize);
            textBox.Multiline = true;
            textBox.BorderStyle = BorderStyle.None;
            this.Controls.Add(textBox);
        }

        private void UserControl1_Resize(object sender, EventArgs e)
        {
            textBox.Size = new Size(this.Width - 3, this.Height - 2);
            textBox.Location = new Point(2, 1);

        }

        private void UserControl1_Paint(object sender, PaintEventArgs e)
        {
            if (isvalid)
                ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Black, ButtonBorderStyle.Solid);
            else
                ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);

        }
    }

更新: isvalid プロパティを追加しました

プロパティを配置して、境界線を表示するかどうかを指定できます。入力が有効な場合は通常の境界線を表示し、制御入力が無効な場合は赤い境界線を表示します。

于 2013-05-28T08:08:38.097 に答える
1

TextBox に直接描画されたものは、TextBox コントロールが何らかの方法で無効になるとすぐに消えます。

正しいアプローチは、ユーザー コントロールをプロジェクトに追加し、そのキャンバスに TextBox を追加することです。その周りに少し境界線を残します。

必要に応じて、ユーザー コントロールのキャンバスの背景を赤くするだけで、TextBox の周りに描かれた境界線のように見えるようになりました。

ユーザー コントロールにコードを直接追加して、テキストが変更されるたびに検証することができます。そうすれば、コードを 1 回記述するだけで、必要な数の TextBox をフォームまたはページに追加するだけで済みます。

于 2013-05-28T08:15:51.847 に答える
0

単にどこかからコントロールにペイントするべきではありません。ペイントでビルドすると、次の機会にオーバーライドされます。コントロールには、ペイントする必要があるペイント イベントがあります。これは、塗装が必要なときに使用されます。

検証メソッドでは、ペイント イベントで使用できるように検証の結果をどこかに保存し、再描画が強制されるように Invalidate() を呼び出す必要があります。

于 2013-05-28T08:08:56.233 に答える