如果出现错误,如何将文本框的边距设置为红色

时间:2017-08-17 22:00:08

标签: c# .net winforms

我只是想知道是否可以轻松地将文本框的边距设置为特定颜色?我使用winforms并且在我的验证事件处理程序中我有一系列error providers,如果返回false,我想将边距设置为红色,如果成功为绿色。这有可能没有隐藏任何控件吗?我知道如何设置前景和面板颜色,但它似乎是如此草率,以至于必须将它全部隐藏在它背后。这是我的验证事件处理程序。

       private void txt_LndLine_Validating(object sender, CancelEventArgs e)
        {

            if (utility.isNum,(txt_LndLine.Text))
            {
                epLandline.SetError(txt_LndLine, "Please use unknown Entity!!!");

                return;
            }

            else 
            {
                epLandline.Clear();
                _IsValid = true;

            } 
        }

只是一个查询,因为事件hadnler工作得很好,只是不会介意一种更聪明的方式来呈现错误而不是图标

2 个答案:

答案 0 :(得分:0)

可能是评论中的答案很好(@RudyTheHunter)。

我有一个简单的方法。

panel控件放在text box正下方,然后更改面板的边框颜色。

我试了一下,看起来如下图所示。

<强>代码:

            if (utility.isNum,(txt_LndLine.Text))
            {
                epLandline.SetError(txt_LndLine, "Please use unknown Entity!!!");
              //PANEL COLOR
              this.panel1.BackColor = System.Drawing.Color.Green;
              this.panel1.Padding = new System.Windows.Forms.Padding(5);

                return;
            }

            else 
            {
                epLandline.Clear();

               //PANEL COLOR
                this.panel1.BackColor = System.Drawing.Color.Red;
                this.panel1.Padding = new System.Windows.Forms.Padding(5);

                _IsValid = true;    
            } 

enter image description here

答案 1 :(得分:0)

这是一个替代解决方案,不会添加任何额外的控件。它将边框绘制到TextBoxes'Parent

通过将例程挂钩到Paint的{​​{1}} TextBox事件中来设置一次,可能是这样的:

Parent

现在,您可以设置textBox1.Parent.Paint += DrawMargins; 以保留您要使用的Tag

Brush

更改textBox1.Tag = Brushes.Red; textBox2.Tag = Brushes.Green; 后需要触发例程,Brush Invalidating

Parent

要从绘画中取出一个textBox1.Parent.Invalidate(); ,请将TextBox重置为Tag

null

你也可以解开整个事件:

textBox1.Tag = null;

这是绘图方法:

textBox1.Parent.Paint -= DrawMargins;

请注意,这适用于private void DrawMargins(object sender, PaintEventArgs e) { Control parent = sender as Control; foreach ( Control ctl in parent.Controls) { SolidBrush brush = ctl.Tag as SolidBrush; if (brush == null) continue; e.Graphics.FillRectangle(brush, ctl.Left - ctl.Margin.Left, ctl.Top - ctl.Margin.Top, ctl.Width + ctl.Margin.Horizontal, ctl.Height + ctl.Margin.Vertical); } } SolidBrush并且是相同父级的子级的任何控件。如果某些控件是嵌套的,比如在Tag或GroupBox中,我猜你应该用Panel参与控件替换parent.Controls集合上的循环。

enter image description here

我已经放大了第一个List<Control>的左边距,你可以看到..