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

3

我看到的几个潜在问题:

  1. 您获得Graphics文本框的对象,但使用表单中文本框的偏移量进行绘图。最终结果:矩形被翻译到文本框的可见区域之外。尝试使用位置(0,0)
  2. 您绘制与文本框一样宽的矩形。最终结果:右侧和底部边缘将不可见。您应该从这些值中减去笔的宽度。

当你在它,检查ErrorProvider。它可能只是满足您现成的需求。

于 2013-05-28T08:01:09.590 回答
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 绘制的边框。

您可以将代码直接添加到用户控件,以便在文本更改时对其进行验证。这样,您只需编写一次代码,然后将所需数量的文本框添加到表单或页面中即可。

于 2013-05-28T08:15:51.847 回答
0

您不应该仅仅从某个地方在控件上进行绘制。绘画中的构建将在下一次覆盖它。控件有一个绘制事件,您应该在其中进行绘制。每当需要绘画时都会使用它。

在您的 validate 方法中,您应该将验证结果存储在某处,以便可以在绘制事件中使用它并调用 Invalidate() 以强制执行重新绘制。

于 2013-05-28T08:08:56.233 回答
0
    // You  may use this


    Label lblHighlight = new Label (); 
    Rectangle rc = new Rectangle(this.Left - 2, this.Top - 2, this.Width + 4, this.Bottom - this.Top + 4);
                    this.Parent.Controls.Add(lblHighlight);
                    lblHighlight.Bounds = rc;

lblHighlight.BackColor = "Red";
于 2013-05-29T11:53:38.017 回答