2

有没有办法以某种方式访问​​ ASP.NET 中的一组控件?

在 jQuery 中,您可以使用 class="somegroup" 访问多个元素,例如

$('.somegroup')...

在 ASP.NET 中,我知道我可以使用 ID 访问元素或控件,但是有没有办法一次访问多个控件或元素?

例如,假设我在设计视图中有这个:

<asp:Label ID="label1" CssClass="someclass"></asp:Label>
<asp:Label ID="lbl" CssClass="someclass"></asp:Label>
<asp:Label ID="lb2" CssClass="someclass"></asp:Label>

现在我想关闭所有这些的可见性。

而不是这样做:

label1.Visible = false;
lbl.Visible = false;
lb2.Visible = false;

有没有等价的?

someclass.Visible = false;

我可以使用不同的标签属性吗?

使用 asp.net 和 C#

4

3 回答 3

1
    public void Apply(string selector, Control parent, Action<WebControl> a)
    {
        if (selector.StartsWith("."))
        {
            foreach(WebControl wc in parent.Controls)
            {
                if (wc.CssClass == selector.Substring(1))
                {
                    a(wc);
                    if (wc.HasControls())
                    {
                        Apply(selector,wc,a);
                    }
                }
            }
        }
        if (selector.StartsWith("#"))
        {
            foreach (WebControl wc in parent.Controls)
            {
                if (wc.ID == selector.Substring(1))
                {
                    a(wc);
                    return;//no need to search any further.
                }else
                {
                    if (wc.HasControls())
                    {
                        Apply(selector, wc, a);
                    }
                }
            }
        }
    }

也许这会有所帮助?

那么你可以这样做:

Apply(".SomeClass", this, a => a.CssClass="SomethingElse"); 
于 2013-11-08T19:13:38.650 回答
1

您可以编写自己的函数,将字符串类传递给它(以及可选的父控件或表单),然后循环通过 Controls 集合检查 CssClass 属性并对匹配的控件进行必要的修改。

就像是

void hide(Control el, string cssClass) {

    foreach (WebControl c in el.Controls)
    {
        if (c.CssClass == cssClass)
        {
            c.Visible = false;
        }
    }
}

并打电话

hide(this, "someclass");
于 2013-11-08T18:35:58.980 回答
0

在 C# 中没有用于执行选择器类型操作的内置语法。

但是,您可以编写自己的循环来执行此操作,如下所示:

private void SetAllLabelsWithCssClassValueToInvisible(Control parentControl, 
                                                      string className)
{
    foreach(Control childControl in parentControls.Controls)
    {
        // Try to cast control to a label, null if it fails
        var label = childControl as Label;

        // Check to see if we successfully cast to label or not
        if(label != null)
        {
            // Yes, it is a label 
            // Does it have the correct CssClass property value?
            if(label.CssClass == className)
            {
                // Update the Visible property to false
                label.Visible = false;
            }
        }
    }
}

注意:显然,您可以扩展/改进此概念并使其适合您的需求,这只是一个概念证明,它非常适用Label于具有特定CssClass值和Visible属性的控件。

在内部,jQuery Sizzle 引擎正在为您执行此循环。

于 2013-11-08T18:39:34.807 回答