检查多个面板中的控件

Checking Controls in multiple panels

我有一个包含多个面板的程序,这些面板的文本框将共享一个值。例如街道地址。我已经编写了一种通过共享 TextChanged 事件来更新这些值的方法,但是该事件不会在面板中搜索控件,它只会影响主窗体 [=28] 中的 TextBox =].

代码。

private void matchtextbox(object sender, EventArgs e)
{
    TextBox objTextBox = (TextBox)sender;
    string textchange = objTextBox.Text;           

    foreach (Control x in this.Controls)
    {
        if (x is TextBox)
        {
            if (((TextBox)x).Name.Contains("textBoxAddress"))
            {
                ((TextBox)x).Text = textchange;
            }
        }
    }
}

所以说 panel1 包含 textBoxAddress1panel 包含 textBoxAddress2,两者都与此 TextChanged 事件有关。他们在打字时不会互相更新。但是,如果他们在 panel 之外,他们就会这样做。

最终代码是基于下面一位可爱的社区成员的决议。

private void Recursive(Control.ControlCollection ctrls)
{
    foreach (var item in ctrls)
    {
        if (item is Panel)
        {
            Recursive(((Panel)item).Controls);
        }
        else if (item is TextBox)
        {
            if (((TextBox)item).Name.Contains("txtSAI"))
            {
                ((TextBox)item).Text = textchange;
            }
        }
    }
}

private void matchtextbox(object sender, EventArgs e)
{
    TextBox objTextBox = (TextBox)sender;
    textchange = objTextBox.Text;  
    Recursive(Controls);
}

string textchange;

为此,您需要一个 recursive 方法:

private void Recursive(IEnumerable ctrls)
{
    foreach (var item in ctrls)
    {
        if (item is Panel)
        {
            Recursive(((Panel)item).Controls);
        }
        else if(item is TextBox)
        {
            if (((TextBox)item).Name.Contains("textBoxAddress"))
            {
                ((TextBox)item).Text = textchange;
            }
        }
    }
}

然后这样称呼它:

private void matchtextbox(object sender, EventArgs e)
{
     Recursive(Controls);
}