C#查找ToolStripButtons

时间:2018-09-04 09:55:24

标签: c# winforms

我试图遍历所有ToolStripButtons并找到所有ToolStripButtons。 我的代码是:

private ToolStripItem FindControl(ToolStripButton parent, string controlName)
    {
        ToolStripButton c = null;
        foreach (ToolStrip ctrl in parent.Owner.Items.ToString())
        {
            if (ctrl.GetType().ToString() == typeof(ToolStrip).ToString())
            {
                foreach (ToolStripButton item in ((ToolStripButton)ctrl).OwnerItem.Name)
                {
                    if (item.GetType().ToString() == typeof(ToolStripButton).ToString())
                    {
                        if (item.Name.Equals(controlName))
                        {
                            //c = item.GetType().ToString() =typeof(ToolStripButton).ToString();
                            return item;
                        }
                    }
                }
            }
            if (c == null)
            {
                c = FindControl(parent.GetType().ToString() == typeof(ToolStripButton).ToString(), parent.Name);
            }

            else
            {
                break;
            }
        }
        return c;
    }

但是它没有产生预期的结果。enter image description here

3 个答案:

答案 0 :(得分:6)

使用Linq <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.6.10</version> </dependency> ,可以大大简化查找所需控件的过程:

.OfType<T>()

答案 1 :(得分:3)

为简化此操作,您可以编写一些辅助函数,如下所示:

public static IEnumerable<Control> AllControls(Control parent)
{
    if (parent == null)
        throw new ArgumentNullException();

    return implementation();

    IEnumerable<Control> implementation()
    {
        foreach (Control control in parent.Controls)
        {
            foreach (Control child in AllControls(control))
            {
                yield return child;
            }

            yield return control;
        }
    }
}

然后您可以找到特定类型的所有控件,如下所示:

var allToolstripButtons = AllControls(parent).OfType<ToolStripButton>();

这是一个递归解决方案,它将查找所有子控件,无论它们在控件结构中的嵌套深度如何-如果您只需要查找作为给定父级的直接子级的ToolStripButton项,则只需使用@Filburt的简单答案。

(注意:内联implementation()函数之所以奇怪,是为了确保在评估parent结果之前检查Enumerable参数是否为空。)

答案 2 :(得分:0)

我的意思是将表单的所有控件列出到一个ListBox中,以便能够设置属性(基于控件的安全性),我终于弄清楚了。

Control Based Security

  

所以我用这段代码弄清楚了”

private void ShowControls(Control.ControlCollection controlCollection)
    {
        foreach (Control c in controlCollection)
        {
            if (c.Controls.Count > 0)
            {
                ShowControls(c.Controls);
            }
            if (c is MenuStrip)
            {
                MenuStrip menuStrip = c as MenuStrip;
                ShowToolStripItems(menuStrip.Items);
            }
            if (c is Panel)
            {
                formToolTip2.SetToolTip(c, c.Name);
                PageControls.Items.Add(c.Name);
            }
            if (c is Button || c is ComboBox || c is TextBox ||
                c is ListBox || c is DataGridView || c is RadioButton ||
                c is RichTextBox || c is TabPage || c is CheckBox || c is ToolStrip)
            {
                var toolstrips = controlCollection.OfType<ToolStrip>();
                foreach (ToolStrip ts in toolstrips)
                {
                    foreach (ToolStripItem tsi in ts.Items)
                    {
                        if (ts.Items.Count > 0)
                        {
                            if (tsi is ToolStripButton)
                            {
                                ToolStripButton tb = tsi as ToolStripButton;
                                tb.ToolTipText = tb.Name;
                                if (!PageControls.Items.Contains(tb.Name))
                                {
                                    PageControls.Items.Add(tb.Name);
                                }
                            }
                        }
                    }
                }
                formToolTip2.SetToolTip(c, c.Name);
                PageControls.Items.Add(c.Name);
            }
        }
    }