C# 简单的方法统一设置控件在焦点获得时,背景色改变,焦点离开时背景色恢复默认

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 简单的方法统一设置控件在焦点获得时,背景色改变,焦点离开时背景色恢复默认相关的知识,希望对你有一定的参考价值。

一个窗口中有29个textbox,29个label,3个button,
想任何一个textbox或button获得焦点时,背景色为red;
失去焦点时,背景色还原

不想一个一个去设置Enter事件

不知有没有好点的办法,或者写成类该怎么写

选中所有的textbox ,打开添加事件的窗口 双击enter 事件
这时候所有的 textbox 都注册在啦一个事件函数里
在事件中写入(textbox tex= (textbox)sender;
tex .background=color.red

如果是button ,并且不同的button对应不同的操作
就需要判断一下 事件源是谁

if(but==button1)


else if (but==button2)


.........................
参考技术A

所有事件都绑定到一个处理函数上:

private void textBox_Enter(object sender, EventArgs e)

    TextBox tbx = sender as TextBox;
    tbx.BackColor = Color.Red;   

追问

怎么绑定处理函数?一个一个取绑定吗?
那和一个一个去写没区别呀

追答

在初始化窗体的时候一个for循环遍历所有TextBox,把事件都绑定到这一个函数上不就完了???

追问

谢谢

本回答被提问者和网友采纳

C#如何在中间层类中抛出异常时获得控制焦点

【中文标题】C#如何在中间层类中抛出异常时获得控制焦点【英文标题】:C# how to get control focus when exception is thrown in middle layer class 【发布时间】:2017-03-11 12:22:53 【问题描述】:

我正在开发一个 Windows 窗体应用程序,其中包含许多必须手动输入的文本和组合框。因此,如果特定控件为空,则需要进行大量检查。我想阅读我的 UI 中的所有验证并将它们移动到中间层。这很好,因为 UI 现在无需验证,并且按预期触发异常,但现在我不知道哪个控件导致异常触发。好吧,我可以,但不能不干预我的 UI,这显然是我不想要的,因为这会使中间层验证变得不必要,因为我可以完全在 UI 中完成它。所以,简而言之,我想要实现的是:如果触发了验证,我想将焦点设置为导致异常的控件,而无需在 UI 中进行焦点硬设置。这可能吗?或者如果没有,最好的解决方案是什么?任何帮助表示赞赏。

我创建了一个简单的例子:

private void btnConfirm_Click(object sender, EventArgs e)

    尝试
    
            Customer.CustomerTN = txtCustomerTN.Text;
            Customer.CustomerName = txtCustomerName.Text;
            Customer.CustomerPhone = txtCustomerPhone.Text;

        MessageBox.Show("Customer TN: " + Customer.CustomerTN + 
                        Environment.NewLine +
                        "Customer Name: " + Customer.CustomerName + 
                        Environment.NewLine +
                        "Customer Phone: " + Customer.CustomerPhone);
   
   catch (Exception ex)
   
       MessageBox.Show(ex.Message);
       return;
   

//中间层类 公共类客户 私有静态字符串 customerTN; 私有静态字符串客户名称; 私有静态字符串 customerPhone;

public static string CustomerTN get return customerTN; set if (value.Length == 0) throw new Exception("Enter Customer TN..."); else customerTN = value; public static string CustomerName get return customerName; set if (value.Length == 0) throw new Exception("Enter Customer Name..."); else customerName = value; public static string CustomerPhone get return customerPhone; set if (value.Length == 0) throw new Exception("Enter Customer Phone..."); else customerPhone = value;

【问题讨论】:

见this 和谷歌C# ErrorProvider。另外,请查看 this 关于 CSLA 编写者创建的一个小应用程序:我很久以前读过它并从中学到了很多东西。 @CodingYoshi 谢谢你。在简要检查提供的链接后,我一定会更深入地调查您的建议。 【参考方案1】:

您可以创建Validation 类的层次结构。每个Validation 类都会有一个list 的控件来验证。当验证发生时,如果控件不符合规则,您可以通过显示一条消息并将焦点放在该控件上来中止验证,例如:

public abstract class ControlValidator<T> where T : Control

     protected List<T> ControlsToValidate;

     public ControlValidator(IEnumerable<T> controls)
     
          this.ControlsToValidate = new List<T>(controls);
     

     public abstract bool ValidateControls();

然后,如果您想要文本框的验证器,您可以创建一个验证器,如下所示:

public class TextBoxValidator : ControlValidator<TextBox>

     public TextBoxValidator(IEnumerable<TextBox> controls) : base(controls)
     

     public override bool ValidateControls()
     
          foreach(TextBox tb in ControlsToValidate)
          
              if (tb.Text == "") // This validates the text cannot be empty
              
                  MessageBox.Show("Text cannot be empty");
                  tb.Focus();
                  return false;
              
          
          return True;
     

然后您将创建一个验证器列表来存储您应用的所有验证器:

 List<ControlValidator> validators = ...

要验证所有控件,您可以执行以下操作:

 foreach(var validator in validators)
 
     if (!validator.ValidateControls())
         break;
 

一旦发现至少有一个控件未成功验证,就会中断 foreach。希望对您有所帮助。

【讨论】:

感谢您迅速而彻底的答复。我会尝试实现它。 @Flin 在 *** 上感谢人们的更好方法是,如果他们的回答对您有帮助,请点赞他们的回答;如果他们的回答完全解决了您面临的问题,则接受他们的回答。 @CodingYoshi 我知道那个 Yoshi。但首先我必须尝试实现它并让它发挥作用。我还不知道它是否能解决我的问题。目前我正在阅读您提供的链接上的材料,以便可能找到更简单的解决方案。尽管如此,我还是非常感谢 DCG 的时间和精力。所以回答赞成。

以上是关于C# 简单的方法统一设置控件在焦点获得时,背景色改变,焦点离开时背景色恢复默认的主要内容,如果未能解决你的问题,请参考以下文章

C#如何获得panel中的控件

Winform中Treeview控件失去焦点,如何将选择的节点还设置为高亮显示?

控件获取焦点问题(C#)

C# winform中咋实现当文本框获得焦点时,如何切换到中文输入法或英文输入法啊?

c#怎么寻找焦点在哪个控件上

C#中 怎么获得某一个控件中图片的某一点像素的颜色值啊?