C# 是否引用以编程方式创建的命名元素?

C# 是否引用以编程方式创建的命名元素?,c#,winforms,richtextbox,C#,Winforms,Richtextbox,我使用以下代码以编程方式创建了RichTextBox: RichTextBox RT = new RichTextBox(); RT.Name = "asdf"; RT.Text = "blah"; TableLayoutPanel.Controls.Add(RT,0,0); 现在让我们假设我想修改RT的文本,它的名称是“asdf”,Visual Studio不允许我编写asdf.text=“哈哈”,因为asdf还不存在 我如何具体地获取“asdf”并设置其文本?由于此RichTextBox

我使用以下代码以编程方式创建了RichTextBox:

RichTextBox RT = new RichTextBox();
RT.Name = "asdf";
RT.Text = "blah";

TableLayoutPanel.Controls.Add(RT,0,0);
现在让我们假设我想修改RT的文本,它的名称是“asdf”,Visual Studio不允许我编写asdf.text=“哈哈”,因为asdf还不存在

我如何具体地获取“asdf”并设置其文本?由于此RichTextBox位于特定单元格中,我可以根据其单元格坐标获取它吗?

嗯。。。您确实实例化了RichTextBox,并且有一个可以使用的引用;在您的示例中,它被称为“RT”

现在,您可能已经在一个方法中完成了这项工作,因此它是本地范围的,并且在需要时不再可用。因此,通过将引用分配给您可以访问的某个成员,您可以以某种方式保存该引用。例如,如果你有很多,并且想通过名字来区分,你可以把它放在
字典中。或者你可以把它放在某个静态变量中;有很多选择,每个都有自己的优点和缺点


您可能不想做的一件事是遍历控件树,查找具有指定名称的控件。但如果你真的想,你也可以这么做

您应该能够通过
TableLayoutPanel.Controls
属性获取对它的引用,该属性返回一个。该类提供了两种按名称定位控件的方法:和。
Item
属性返回具有指定名称的控件,而
Find
方法返回控件的集合。在这两种情况下,您都需要从
控件转换为
RichTextBox

var rt = (RichTextBox)myTableLayoutPanel.Controls.Item["asdf"];

// or

var rts = myTableLayoutPanel.Controls.Find("asdf", false);
foreach (var rt in rts)
    // (RichTextBox)rt ...

编辑:如果找不到控件,请确保在使用它之前检查结果是否为空。

Randolpho,这非常有用,我将尝试实现您在这里描述的内容。谢谢@Randopo~我认为查找控件。Find('name',false)正是该特定函数存在的原因。你为什么不把它用于那个目的?如果要动态构建数千个控件,可能需要一些时间才能找到它,但我不认为大多数表单包含的元素都会超过几百个,所以在树上行走(是的,我看到reflector确实为(i);i@drachenstern让我用另一种方式告诉你:如果你正在构建一个有大量记录的数据库表,并且知道你要搜索一个你知道的字段是独一无二的,你就不能在那个字段上加一个索引,这样你就可以更快地搜索了吗?请考虑我的<代码>字典<代码>是这样的索引。@ Randolpho~Define
sizeable
。我认为对于
.Find()的控制,只需不到[大量]个
方法对于手头的工作来说已经足够了。我并不是说它不是一个有效的设计,但这家伙把
RT
asdf
搞混了。复杂性和优雅是经验丰富的人的工具。我不是说字典不会更快。我只是问“什么足够快?”?@Randolpho~谢谢,你这方面的设计很好,你知道。如果我自己设计一个表单应用程序,我可能会像你说的那样去做;)…就像他那样思考。