2017-05-30 23 views
0

我已经将少量控件添加到表中并将该表添加到面板。现在,我想用另一种方法访问这些控件(如文本框,下拉菜单等)。 我想作为使用LINQ选择面板中的控件

List<Control> panelControls = (from pControls in _controlsPanel.Controls.OfType<Table>(). OfType<TableRow>().OfType<TableCell>().OfType<Control>() 
               .Where(ctrl => (ctrl is TextBox || ctrl is DropDownList)) 
              select pControls).ToList(); 

这是evudently给我没有控制我加入到表,并最终以面板。

我应该将我的表中的每个控件添加到面板还是有更好的方法来检索控件?

因为,我想,因为所有的控件都在一个表格中,所以我再次将控件添加到面板显得多余。不过,我可能是错的。请澄清。

+0

。 OfType ().OfType().OfType ()=>这些都是错误的。你必须.Items或.Controls – hiule

回答

0

你似乎混合query and method syntax这是让我的头受伤。为了我的答案,我会坚持使用方法语法。

在您的LINQ中,您将从一个列表(pControls)开始,并应用几个OfTypeWhere子句,其中每个子句都将过滤列表。因此,你在说“给我所有的控件,这些控件是表格和表格行,是文本框或下拉列表。”没有对象既是一个表格也是一个表格行,所以在那里你会得到一个空的列表。相反,你必须走这个层次结构。您需要生成一个列表(例如表格),然后使用该列表中的项目来获取另一个列表(属于这些表格的控件)。

如果你想获得一个面板上所有的控件,您只需使用

var panelControls = pControls.Controls; 

如果你想从一个表中获取所有的控件,第一次进入该表的参考。例如,如果你的表名为MyTable

var table = pControls.Controls.OfType<Table>().Where(c => c.ID == "MyTable").First(); 

然后使用该引用来获得控制:

var controls = table.Controls; 

,或者如果你想这一切在一个声明:

var controls = pControls.Controls 
         .OfType<Table>() 
         .Where(c => c.ID == "MyTable") 
         .First() 
         .Controls; 

然后,您可以过滤该列表以获得文本框或下拉列表:

var list = controls.OfType<Control>().Where(c => c is TextBox || c is DropDownList); 

或者,如果你真的想要这一切在一个声明:

var list = pControls.Controls 
        .OfType<Table>() 
        .Where(c => c.ID == "MyTable") 
        .First() 
        .Controls 
        .OfType<Control>() 
        .Where(c => c is TextBox || c is DropDownList); 
+0

感谢John对指针的非常接近,但是如果我的表ID是动态生成的并且我不知道它会怎么样。 – Programmerzzz

+0

如果只有一个表,则删除where子句。如果有多个表,并且想要合并它们,则必须使用“ForEach”方法并分别遍历每个表的控件。 –

+0

我这样做了,但它只是给出了一些错误,说最后一个'where'没有定义。就像一个参考,我将文本框添加到TableCell和TableCells到TableRow和TableRows到表,并最终表格到面板。'TextBox/DropDowns - > TableCell - > TableRow - > Table - > Panel' – Programmerzzz