所以,a System.Windows.Forms.Control具有Controls类型的属性Control.ControlCollection.我在一个表单上有一个控件,在这个集合中有一堆小的子控件.这些子控件具有标签和文本标识符,它是数据库中的字段名称.
我需要能够回到Controls集合中并按名称查找控件.ControlCollection有一个public virtual Control this[string key] { get; }和一个public virtual bool ContainsKey(string key),所以看起来我应该能够查找它们.
但是,Add function(public virtual void Add(Control value))不接受一个键字符串,只是System.Windows.Forms.Control你要添加的,而我所有的调用ContainsKey都返回false.
在Control必须覆盖的东西上必须被覆盖才能成为密钥(因为只有Control传递了),我尝试覆盖ToString()返回数据库字段名称(我想用于查找),但是ContainsKey当我知道一个时仍然返回false控制指定的字段存在.
this[string key] { get; }关键参数的文档是"要从控件集合中检索的控件的名称".在Control不具有Name属性我可以重写,其唯一的名称属性包含类的名称,这将是我加入每个控制相同.ContainsKey(string key)说关键参数的文档是"定位的关键",这甚至没那么有用.
找到了答案,但我已经写了所有这些,所以我不妨发布它然后自我回答,以防其他人可能发现它有用...
虽然我无法覆盖Name属性,但它是{get; set;},而不是纯粹的{get;},正如我愚蠢地假设的那样.因此,如果我将Name控件设置为数据库字段名称,然后将其添加到Controls集合中,我可以按预期查找它.
答案是在方法的摘要文档中Control[] Find(string key, bool searchAllChildren),而不是我将要使用的函数的文档:"通过System.Windows.Forms.Control.Name属性搜索控件,并构建一个匹配的所有控件的数组. "