1

如何为以相同形式存在的所有文本框赋予相同的属性。

      foreach (var textbox in this.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }

上面的代码仅在文本框不是嵌套格式时才有效。

在我的项目中,我在 tabcontrol 中有多个标签页。所以我不能实现上面的代码。但我可以实现以下代码:

      foreach (TextBox textbox in this.Controls.OfType<TabControl>().SelectMany(tc => tc.Controls.OfType<TabPage>().SelectMany(page => page.Controls.OfType<TextBox>())))
        {
            textbox.ContextMenu = new ContextMenu();
        }
        foreach (var textbox in this.tabCarInsurance.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }
        foreach (var textbox in this.tabHomeLoans.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }
        foreach (var textbox in this.tabRetirement.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }

在这里,我正在为每个 tabControl 实现。我仍然不喜欢(因为我有更多的标签页要处理)。有没有办法减少上面的代码。

我尝试了以下代码:(不工作

       foreach (var textbox in this.Controls.OfType<TabControl>().OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }

我从上一个问题中得到了上面的代码知识。

请帮助
提前致谢。

4

4 回答 4

3
 private void SetProperty(Control ctr)
    {
        foreach(Control control in ctr.Controls)
        {
            if (control is TextBox)
            {
                control.ContextMenu = new ContextMenu();               
            }
            else
            {
                if (control.HasChildren)
                {
                    SetProperty(control);
                }                    
            }
        }
    }
于 2012-10-15T12:46:37.187 回答
1

只需使用递归遍历所有控件子集合:

void SetControl(ContextMenu menu, Control control)
{
    if (control is TextBox)
        control.ContextMenu = menu;
    else
    {
        foreach (Control c in control.Controls)
            SetControl(menu, c);
    }
}

它将找到所有文本框并为所有文本框设置一个相同的上下文菜单。

例如,您可以从表单的 OnLoad 事件处理程序中调用它。虽然假设您已经yourContextMenu为表单定义了。

    private void Form1_Load(object sender, EventArgs e)
    {
        SetControl(yourContextMenu, this);
    }
于 2012-10-15T12:49:57.923 回答
1

从您的 tabcontrol 容器调用的扩展方法怎么样...

public static class ControlExtensions
{
    public static void SetContextMenuOnChildTextBoxes(this Control control)
    {
        if (control is TextBox)
        {
            control.ContextMenu = new ContextMenu();
        }
        if (control.Controls != null)
        {
            foreach (Control controlChild in control.Controls)
            {
                controlChild.SetContextMenuOnChildTextBoxes();
            }
        }
    }
}

这可以放在代码的公共区域中,以便可以从任何需要此功能的父母那里调用它。

于 2012-10-15T12:51:21.117 回答
0

尝试:

private void CtxMenu(Control parent)
{
    foreach (Control child in parent.Controls)
    {
        if (child is TextBox)
        {
            (child as TextBox).ContextMenu = new ContextMenu(); 
        }
}
于 2012-10-15T12:48:39.593 回答