c#按名称删除组件
本文关键字:删除 组件 | 更新日期: 2023-09-27 18:17:02
嗯,我正在创建一个能够根据其名称和类型从面板中删除组件的方法。我的代码是:
private void RemoveItemByName<T>(Panel panel, string name)
{
foreach (T item in panel.Controls.OfType<T>().Where(item => item.Name == name))
panel.Controls.Remove(item);
}
但是属性Name
在类型T
中不存在,因为T
还没有定义。我想这样使用它:
RemoveItemByName<TextBox>(pnlMain, "txtPesquisa");
RemoveItemByName<Button>(pnlMain, "btnCloseSearch");
在这种情况下,编译器给我两个错误:Cannot resolve symbol 'Name' in item
和Argument type 'T' is not assignable to parameter type 'System.Windows.Forms.Control'
当我尝试将T转换为可接受的类型时,它不允许我这样做。我怎样才能把这个转换成这样呢?
您必须给T
一个约束,以便编译器知道类型上可用的方法和属性:
private void RemoveItemByName<T>(Panel panel, string name)
where T : System.Windows.Control
{
foreach (T item in panel.Controls.OfType<T>().ToList().Where(
item => item.Name == name))
panel.Controls.Remove(item);
}
这将告诉编译器可以传递Control
类型的任何对象(包括从它继承的对象)