我有几个按钮元素,当满足某个条件时,我希望将其设置为visible = false
。
我有一个方法可以做到这一点,我在其中定义一个列表并添加所需的按钮元素。然后我遍历列表并隐藏所有这些元素:
Sub restrictEditAccess()
Dim editButtons As New List(Of Control)()
editButtons.Add(button1)
editButtons.Add(button2)
...
editButtons.Add(button9)
For Each button In editButtons
button.Visible = False
Next
End Sub
在VB中有没有办法做一个jQuery样式选择器(特别是在后端)以减少vb代码,例如:
elementsWithHTMLAttribute.Attribute("data-editAccess").visible = false
答案 0 :(得分:1)
好的,这是一个解决方案,它使用了一些泛型和Func魔法。我在C#中编写了这个,然后使用http://converter.telerik.com/将其转换为VB.net。所以如果有一个语法错误,你就必须自己解决它 - 抱歉。
我有以下标记:
<asp:Button ID="button1" runat="server" Text="Button 2"/>
<asp:Button ID="button3" runat="server" Text="Button 3" data-foo="bar"/>
<asp:Button ID="button4" runat="server" Text="Button 4"/>
以下助手类:
Module Helper
Function GetControls(Of T As WebControl)(ByVal cCol As ControlCollection, ByVal results As List(Of T), ByVal predicate As Func(Of T, Boolean)) As List(Of T)
For Each control As Control In cCol
If TypeOf control Is T AndAlso predicate(CType(control, T)) Then results.Add(CType(control, T))
If control.HasControls() Then GetControls(Of T)(control.Controls, results, predicate)
Next
Return results
End Function
Function GetControls(Of T As WebControl)(ByVal cCol As ControlCollection, ByVal predicate As Func(Of T, Boolean)) As List(Of T)
Return GetControls(cCol, New List(Of T)(), predicate)
End Function
End Module
在您的aspx页面中,您可以使用此代码段(抱歉c#)
来调用它Private buttons = Helper.GetControls(Of Button)(Me.Controls, Function(x) x.Attributes("data-foo") = "bar")
它做的很简单。辅助类以递归方式迭代所有嵌套的ControlCollections,从提供的父集合开始,然后遍历每个控件并检查其类型以及它是否与提供的谓词匹配。如果是这种情况,则将其添加到结果列表中。
然后,您可以使用这些控件执行任何操作。
请注意,此代码尚未生成就绪,因为它不会执行任何空检查,并且如果您不提供谓词,则很可能会中断。我将此作为练习留给你。
-------------------- C#Original ------------------------- ---
public static class Helper
{
public static List<T> GetControls<T>(ControlCollection cCol,
List<T> results,
Func<T,bool> predicate) where T : WebControl
{
foreach (Control control in cCol)
{
if (control is T && predicate((T)control))
results.Add((T)control);
if (control.HasControls())
GetControls<T>(control.Controls, results, predicate);
}
return results;
}
public static List<T> GetControls<T>(ControlCollection cCol, Func<T,bool> predicate) where T : WebControl
{
return GetControls(cCol, new List<T>(), predicate);
}
}