我有一组单选按钮,它们放置在它们自己的容器中以用于CSS样式。他们看起来像这样:
<div id="radiobuttonscontainer" runat="server">
<div class="buttoncontainer">
<asp:RadioButton ID="rb1" runat="server" GroupName="rbgroup"/>
</div>
<div class="buttoncontainer">
<asp:RadioButton ID="rb2" runat="server" GroupName="rbgroup"/>
</div>
</div>
我想对这些按钮进行分组,并找到选中的按钮。这似乎是GroupName
的逻辑功能,但事实并非如此。
如果它们都在单个<div>
容器中,我可以使用简单的LINQ查询在它们之间循环:
var checkedButton = radiobuttonscontainer.Controls.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked);
我可以修改此表达式以进入和退出buttoncontainer
div吗?
答案 0 :(得分:1)
我没有使用HTML控件,而是将buttoncontainer
div元素更改为asp:Panel
元素,因为这些元素在最终HTML中呈现为div
元素,同时允许将它们视为。 NET对象。然后,我可以执行特定的嵌套LINQ查询,如下所示:
RadioButton selected = radiobuttonscontainer.Controls.OfType<Panel>()
.SelectMany(c => c.Controls.OfType<RadioButton>())
.FirstOrDefault(r => r.Checked);
第一次迭代(radiobuttonscontainer.Controls.OfType<Panel>()
)返回容器中的所有Panel
对象,但添加了.SelectMany(c => c.Controls.OfType<RadioButton>())
后,该选择将精炼为任何RadioButton
对象在第一个选择中(即Panels
的IE“进入和退出”)。这是因为我用SelectMany
的{{1}}参数专门标识了这些控件。
由于我的设计在每个面板中只允许一个c => c.Controls.OfType<RadioButton>()
元素,所以这不是问题,但是如果我有多个RadioButton
元素,则可能必须优化参数以使其更具体取决于用例。
最后一部分(RadioButton
)进一步细化选择,返回被检查的第一个.FirstOrDefault(r => r.Checked)
对象。由于在这种情况下只能选择一个RadioButton
,因此这仅满足并返回单个对象。如果可以检查多个RadioButton
,则需要使用另一个RadioButton
表达式而不是SelectMany
,并且返回的对象将是FirstOrDefault
对象的列表或数组。
非常感谢C#聊天中的Tom W和milleniumbug的帮助。