在一次操作中更改多个ASP.NET控件的属性

在一次操作中更改多个ASP.NET控件的属性,asp.net,Asp.net,我想知道在ASP.NET中是否可以在一次操作中更改一组控件的属性。当然,有很多方法可以解决这个问题,但是有人知道一个优雅的解决方案吗 示例伪代码 First Name <asp:TextBox runat="server" ID="tbxFirstName" ControlGroup="Editable" /> <asp:Label runat="server" ID="lblFirstName" ControlGroup="ReadOnly" /> Last Name

我想知道在ASP.NET中是否可以在一次操作中更改一组控件的属性。当然,有很多方法可以解决这个问题,但是有人知道一个优雅的解决方案吗

示例伪代码

First Name
<asp:TextBox runat="server" ID="tbxFirstName" ControlGroup="Editable" />
<asp:Label runat="server" ID="lblFirstName" ControlGroup="ReadOnly" />

Last Name
<asp:TextBox runat="server" ID="tbxLastName" ControlGroup="Editable" />
<asp:Label runat="server" ID="lblLastName" ControlGroup="ReadOnly" />

protected void ChageMode(bool isReadOnly)
{
    ControlGroups["Editable"].ForEach(c => c.Visible = !isReadOnly);
    ControlGroups["ReadOnly"].ForEach(c => c.Visible = isReadOnly);
}
名字
姓
受保护的void ChageMode(bool isReadOnly)
{
控制组[“可编辑”].ForEach(c=>c.Visible=!isReadOnly);
控制组[“只读”].ForEach(c=>c.Visible=isReadOnly);
}

您可以执行类似的操作:


                pnl.Controls.OfType()
                    .ToList()
                    .ForEach(t => { t.ReadOnly = yourChoose; t.Text = yourValue; } );

这段代码搜索页面中的每个文本框(然后更改readonly和text属性)

我试图找出如何做到这一点,我想我已经找到了解决方案。 您可以在aspx端的控件上定义属性。如果控件是
WebControl
,您也可以查询这些属性(许多控件,如TextBox、Label、Button等都是WebControl,但有些数据绑定控件,如Repeater、GridView则不是)。通过使用这些信息,我编写了一个递归方法。下面是它的用法:

First Name
<asp:TextBox runat="server" ID="tbxFirstName" ControlGroup="Editable" />
<asp:Label runat="server" ID="lblFirstName" ControlGroup="ReadOnly" />
Last Name
<asp:TextBox runat="server" ID="tbxLastName" ControlGroup="Editable" />
<asp:Label runat="server" ID="lblLastName" ControlGroup="ReadOnly" />
<asp:Button ID="btn" runat="server" Text="Do" OnClick="btn_Click" />
名字
姓
代码隐藏:

protected void btn_Click(object sender, EventArgs e)
{
    var controlsOfGroupReadonly = ControlsInGroup("Readonly");
}

protected IEnumerable<WebControl> FindControlsInGroup(Control control, string group)
{
    WebControl webControl = control as WebControl;
    if (webControl != null && webControl.Attributes["ControlGroup"] != null && webControl.Attributes["ControlGroup"] == group)
    {
        yield return webControl;
    }

    foreach (Control item in control.Controls)
    {
        webControl = item as WebControl;
        if (webControl != null && webControl.Attributes["ControlGroup"] != null && webControl.Attributes["ControlGroup"] == group)
        {
            yield return webControl;
        }
        foreach (var c in FindControlsInGroup(item, group))
        {
            yield return c;
        }
    }
}

protected IEnumerable<WebControl> ControlsInGroup(string group)
{
    return FindControlsInGroup(Page, group);
}
protectedvoidbtn\u单击(对象发送方,事件参数e)
{
var controlsOfGroupReadonly=ControlsInGroup(“Readonly”);
}
受保护的IEnumerable FindControlsGroup(控件控件,字符串组)
{
网络控制网络控制=控制为网络控制;
if(网络控制!=null&&webControl.Attributes[“ControlGroup”]!=null&&webControl.Attributes[“ControlGroup”]==group)
{
产量回收网络控制;
}
foreach(Control.Controls中的控制项)
{
网络控制=作为网络控制的项目;
if(网络控制!=null&&webControl.Attributes[“ControlGroup”]!=null&&webControl.Attributes[“ControlGroup”]==group)
{
产量回收网络控制;
}
foreach(FindControl组(项,组)中的变量c)
{
收益率c;
}
}
}
受保护的IEnumerable控件组(字符串组)
{
返回FindControlsGroup(页面,组);
}
我不知道是否有办法将此方法转换为索引器

我试过了,结果对我来说是成功的


这是个好问题。谢谢:)

是的,这是一个直截了当的解决方案,但我很感兴趣的是ASP.NET是否有一些本机的解决方案,还是需要更少代码的解决方案(这里您没有考虑控件可以嵌套),我认为根控件也应该移动到参数,因为您可能希望在FormView e.x中搜索。同时进入模板字段也是一个值得解决的问题。实际上,您是对的。但是,findControlsGroup方法按您所说的做。您可以将任何控件作为参数传递,它将返回该组中的控件。可能是我们可以给ControlSingGroup和FindControlSingGroup方法赋予与重载相同的名称。