代码之家  ›  专栏  ›  技术社区  ›  Sergej Andrejev

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

  •  1
  • Sergej Andrejev  · 技术社区  · 14 年前

    我想知道在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);
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Musa Hafalir    14 年前

    我试图弄明白这是怎么做到的,我想我已经找到了解决办法。 可以在ASPX端定义控件的属性。如果控件是 WebControl (许多控件(如文本框、标签、按钮等)是WebControls,但某些数据绑定控件(如中继器、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);
    }
    

    我不知道是否有方法可以将此方法转换为索引器。

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

    这是个好问题。谢谢:)

        2
  •  1
  •   frabiacca    14 年前

    您可以执行类似的操作:

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

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