循环访问UserControl的控件

时间:2010-09-30 20:23:11

标签: c# asp.net user-controls controls

我有一个带有5个简单单选按钮的用户控件,我需要遍历代码隐藏中的那些,但我在如何做到这一点上画了一个很大的空白。有人可以帮忙吗

4 个答案:

答案 0 :(得分:10)

foreach (var ctl in this.Controls)
{
    if (ctl is RadioButton)
    {
       // stuff
    }
}

请注意,这是递归。如果您的radiobuttons在控制容器层次结构中向下,您将需要编写一个递归方法来查找它们。有关递归FindControl函数的示例,请参阅我的旧答案here

答案 1 :(得分:0)

在这里猜测一下,但是如果你想要一组相关的单选按钮,你不应该使用单独的单选按钮控件,而是使用RadioButtonList控件。这将保留组中的所有单选按钮,并允许您迭代它们。

答案 2 :(得分:0)

对于你的情况,这可能有点晚了,但这篇文章帮助我发现了你的问题的解决方案(结果证明是我的确切问题) - 特别是如何在某种程度上选择用户控件中的单选按钮组如果单选按钮组更改,则不需要更改代码。这是我提出的解决方案:

Protected Function GetRadioButtonGroup(ByVal control As Control, ByVal groupName As String) As RadioButton()
    Dim rbList As New System.Collections.Generic.List(Of RadioButton)
    If TypeOf control Is RadioButton AndAlso DirectCast(control, RadioButton).GroupName = groupName Then
        rbList.Add(control)
    End If
    If control.HasControls Then
        For Each subcontrol As Control In control.Controls
            rbList.AddRange(GetRadioButtonGroup(subcontrol, groupName))
        Next
    End If
    Return rbList.ToArray
End Function

然后您需要做的就是获取组中的单选按钮(而不是其他控件):

Dim radioButtons As RadioButton() = GetRadioButtonGroup(Me, "MyGroupName")

很抱歉,“使用RadioButtonList”不是修改其他人编写的现有代码的好方法,因为它需要对标记和css进行重大更改。当然,如果我发现自己编写自己的控件,我将使用RadioButtonList。

答案 3 :(得分:0)

您可以使用 Linq 循环访问所需的用户控件,此代码还按 TabIndex 对迭代进行排序:

IEnumerable<RadioButton> rbs = this.Controls.OfType<RadioButton>().OrderBy(ci => ci.TabIndex);
foreach (RadioButton rb in rbs)
{
    // do stuff
}