Assigning event TextChanged to all textboxes in Form

后端 未结 3 1776
一个人的身影
一个人的身影 2020-12-11 14:11

Hello I was wondering how can I keep an eye on all textboxes in Form whether in any of them was changed value. I saw some code here

private voi         


        
相关标签:
3条回答
  • 2020-12-11 14:34

    You can make your method recursive:

    private void Form1_Load(object sender, EventArgs e)
    {
        Assign(this);
    }
    
    void Assign(Control control)
    {
        foreach (Control ctrl in control.Controls)
        {
            if (ctrl is TextBox)
            {
                TextBox tb = (TextBox)ctrl;
                tb.TextChanged += new EventHandler(tb_TextChanged);
            }
            else
            {
                Assign(ctrl);
            }
        }
    }
    
    void tb_TextChanged(object sender, EventArgs e)
    {
        TextBox tb = (TextBox)sender;
        tb.Tag = "CHANGED"; // or whatever
    }
    

    Just find a better name for the method instead of Assign.

    0 讨论(0)
  • 2020-12-11 14:34

    You need another loop for the groupbox and panels, you can use this code:

    private void addEvents(Control.ControlCollection ct)
    {
        foreach (Control ctrl in ct)
        {
            if (ctrl is TextBox)
            {
                TextBox tb = (TextBox)ctrl;
                tb.TextChanged += new EventHandler(tb_TextChanged);
            }
            else if (ctrl is GroupBox || ctrl is Panel) addEvents(ctrl.Controls);
        }
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        addEvents(this.Controls);
    }
    
    void tb_TextChanged(object sender, EventArgs e)
    {
        TextBox tb = (TextBox)sender;
        tb.Tag = "CHANGED"; // or whatever
    }
    
    0 讨论(0)
  • 2020-12-11 14:45

    When you have to deal with nested controls, 1 for loop can't help. You have to use some recursive method or custom stack to loop through all the controls, something like this:

    private void RegisterTextChangedEventHandler(Control root){
       Stack<Control> stack = new Stack<Control>();
       stack.Push(root);  
       Control current = null;     
       while(stack.Count>0){
          current = stack.Pop();
          foreach(var c in current.Controls){
             if(c is TextBox) ((TextBox)c).TextChanged += textChanged;
             stack.Push(c);
          }
       }
    }
    private void textChanged(object sender, EventArgs e){
       //....
    }
    //Use it
    RegisterTextChangedEventHandler(yourForm);//Or your container ....
    
    0 讨论(0)
提交回复
热议问题