2010-09-27 77 views
2

我有下面的代码编程方式创建一个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位于特定单元格中,我可以根据其单元格坐标来抓取它吗?

回答

1

那么......你确实实例化RichTextBox并有一个可以使用的引用;在你的例子中它被称为“RT”。

现在,您可能已经在某个方法中完成了此操作,因此它在本地范围内,并且在您需要时不再可用。因此,您可以通过将其分配给您可以访问的某个成员来以某种方式保存该参考。例如,如果你有很多这样的设备,并想以某种方式通过名称进行区分,则可以将其粘贴到Dictionary<string, RichTextBox>。或者你可以把它放在一些静态变量中;有很多选择,每个都有自己的优点和缺点。

你可能想要做的一件事想要做的就是走控制树寻找与你指定的名称控制。但是如果你真的想要的话,你也可以这样做。

+0

Randolpho,这非常有帮助,我会尽力实施你在这里描述的内容。谢谢! – sooprise 2010-09-27 15:23:39

+0

@Randopho〜我认为寻找Controls.Find('name',false)是该特定函数存在的原因。你为什么不用它来达到这个目的?如果您动态地构建数以千计的控件,可能需要一些时间才能找到它,但我不认为大多数表单将包含超过几百个元素,所以走树(是的,我看到反射器确实显示了“因为(i; i jcolebrand 2010-09-27 16:13:23

+0

@drachenstern:让我以另一种方式给你:如果你正在建立一个有大量记录的数据库表,并且知道你要在一个你知道会独特的领域进行搜索,你会不会在该领域放置一个索引,以便您可以更快地搜索?考虑我的'Dictionary '是这样一个索引。 – Randolpho 2010-09-27 16:25:36

2

您应该能够通过TableLayoutPanel.Controls属性获取对其的引用,该属性返回TableLayoutControlCollection。该类提供了两种方法来按名称查找控件:Item propertyFind methodItem属性返回一个具有指定名称的控件,而Find方法返回一组控件。在这两种情况下,你都需要从Control投射到RichTextBox

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

// or 

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

编辑:一定要检查未发现控制的情况下,使用它之前的结果不为空。