在C#中按名称获取Windows窗体控件

59 c# string controls accessibility winforms

我有一个名为"myMenu"的ToolStripMenuItem.我怎样才能这样访问:

/* Normally, I would do: */
this.myMenu... etc.

/* But how do I access it like this: */
String name = myMenu;
this.name...
Run Code Online (Sandbox Code Playgroud)

这是因为我从XML文件动态生成ToolStripMenuItems,需要通过动态生成的名称来引用menuitems.

Adr*_*der 113

使用Control.ControlCollection.Find方法.

试试这个:

this.Controls.Find()
Run Code Online (Sandbox Code Playgroud)

  • 对于一个文本框,我必须转换为控件类型并采取如下的第一个元素:`((TextBox)frm.Controls.Find("controlName",true)[0]).Text ="yay";` (14认同)
  • http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.find%28VS.80%29.aspx (3认同)
  • 这对我不起作用。我认为是因为,正如 o3o 所指出的,ToolStripMenuItem 不是 Control。 (2认同)

小智 36

string name = "the_name_you_know";

Control ctn = this.Controls[name];

ctn.Text = "Example...";
Run Code Online (Sandbox Code Playgroud)

  • ToolStripMenuItem 的唯一问题是它不是控件,您的代码将无法工作。;( (2认同)
  • 其实这个答案更接近我的问题。 (2认同)

ano*_*ard 9

Control GetControlByName(string Name)
{
    foreach(Control c in this.Controls)
        if(c.Name == Name)
            return c;

    return null;
}
Run Code Online (Sandbox Code Playgroud)

无视这一点,我重新发明轮子.


dmi*_*scu 6

假设您有menuStrip对象并且菜单只有一个深度,请使用:

ToolStripMenuItem item = menuStrip.Items
    .OfType<ToolStripMenuItem>()
    .SelectMany(it => it.DropDownItems.OfType<ToolStripMenuItem>())
    .SingleOrDefault(n => n.Name == "MyMenu");
Run Code Online (Sandbox Code Playgroud)

对于更深层菜单级别,在语句中添加更多SelectMany运算符.

如果要搜索条带中的所有菜单项,请使用

ToolStripMenuItem item = menuStrip.Items
    .Find("MyMenu",true)
    .OfType<ToolStripMenuItem>()
    .Single();
Run Code Online (Sandbox Code Playgroud)

但是,请确保每个菜单都有不同的名称,以避免密钥重复引发异常.

为了避免异常,您可以使用FirstOrDefault而不是SingleOrDefault/ Single,或者如果您可能有Name重复项,则只返回序列.


V1N*_*NNY 5

使用Philip Wallace的相同方法,我们可以这样做:

    public Control GetControlByName(Control ParentCntl, string NameToSearch)
    {
        if (ParentCntl.Name == NameToSearch)
            return ParentCntl;

        foreach (Control ChildCntl in ParentCntl.Controls)
        {
            Control ResultCntl = GetControlByName(ChildCntl, NameToSearch);
            if (ResultCntl != null)
                return ResultCntl;
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

例子:

    public void doSomething() 
    {
            TextBox myTextBox = (TextBox) this.GetControlByName(this, "mytextboxname");
            myTextBox.Text = "Hello!";
    }
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助!:)


dan*_*004 5

最好的方法之一是像这样的一行代码:

PictureBox在此示例中,我们按表单中的名称搜索所有内容

PictureBox[] picSample = 
                    (PictureBox)this.Controls.Find(PIC_SAMPLE_NAME, true);
Run Code Online (Sandbox Code Playgroud)

最重要的是 的第二个参数find

如果您确定控件名称存在,则可以直接使用它:

  PictureBox picSample = 
                        (PictureBox)this.Controls.Find(PIC_SAMPLE_NAME, true)[0];
Run Code Online (Sandbox Code Playgroud)


Fer*_*ÇER 5

您可以在 Form 类中使用 find 函数。如果你想投射 (Label) ,(TextView) ...等,这样你就可以使用对象的特殊功能。它将返回 Label 对象。

(Label)this.Controls.Find(name,true)[0];
Run Code Online (Sandbox Code Playgroud)

name : 表单中搜索到的项目的项目名称

true:搜索所有 Children 布尔值