C#:使用runat=”获取所有控件;服务器";
我有很多带有很多控件的.aspx页面。这些控件都以类似的方式声明:C#:使用runat=”获取所有控件;服务器";,c#,asp.net,C#,Asp.net,我有很多带有很多控件的.aspx页面。这些控件都以类似的方式声明: <input type="text" runat="server" id="txtLatitude" /> 但是,对于每个页面中的每个控件,手动执行该操作将花费我很多时间。我想知道是否有办法通过runat=“server”获取所有控件的列表或其他内容。 我试着用 ControlCollection myControls = Page.Controls 为了得到它们,我在调试模式下查看了myControls,它似乎
<input type="text" runat="server" id="txtLatitude" />
但是,对于每个页面中的每个控件,手动执行该操作将花费我很多时间。我想知道是否有办法通过runat=“server”获取所有控件的列表或其他内容。
我试着用
ControlCollection myControls = Page.Controls
为了得到它们,我在调试模式下查看了myControls,它似乎得到了少量的控件,可能只有使用asp特定符号声明的控件,对此不确定
有了这个列表,我只需做一个foreach循环,并向每个循环添加readonly属性,只需几行代码。思想?
(或者我只是个哑巴,无法以正确的方式导航和搜索myControls=D)摘自:
//
///提供与对象相关的实用程序方法
///
公共静态类控制实用程序
{
///
///在控件树中查找所选控件的第一个祖先
///
///要查找的祖先的类型
///控件以查找其祖先
///指定类型的第一个祖先,如果找不到祖先,则为null。
公共静态TControl FindAncestor(此控件),其中TControl:Control
{
如果(control==null)抛出新的ArgumentNullException(“control”);
控制父=控制;
做
{
父=父。父;
var候选者=作为TControl的父对象;
if(候选者!=null)
{
返回候选人;
}
}while(parent!=null);
返回null;
}
///
///查找指定控件的特定类型的所有子代。
///
///要查找的子控件的类型。
///要查看的父控件。
///所有相应的后代
公共静态IEnumerable FindDescents(此控件父控件),其中TControl:Control
{
如果(parent==null)抛出新的ArgumentNullException(“control”);
if(parent.HasControls())
{
foreach(父控件中的控件childControl)
{
var候选者=作为TControl的childControl;
如果(candidate!=null)生成返回候选者;
foreach(FindDescents中的下一级变量(儿童控制))
{
下一级收益率;
}
}
}
}
}
然后做一些类似的事情:
foreach(var ctrl in Page.FindDescendants<HtmlInputText>())
{
ctrl.Attributes.Add("readonly","readonly");
}
foreach(Page.finddescents()中的var ctrl)
{
添加(“只读”、“只读”);
}
摘自:
//
///提供与对象相关的实用程序方法
///
公共静态类控制实用程序
{
///
///在控件树中查找所选控件的第一个祖先
///
///要查找的祖先的类型
///控件以查找其祖先
///指定类型的第一个祖先,如果找不到祖先,则为null。
公共静态TControl FindAncestor(此控件),其中TControl:Control
{
如果(control==null)抛出新的ArgumentNullException(“control”);
控制父=控制;
做
{
父=父。父;
var候选者=作为TControl的父对象;
if(候选者!=null)
{
返回候选人;
}
}while(parent!=null);
返回null;
}
///
///查找指定控件的特定类型的所有子代。
///
///要查找的子控件的类型。
///要查看的父控件。
///所有相应的后代
公共静态IEnumerable FindDescents(此控件父控件),其中TControl:Control
{
如果(parent==null)抛出新的ArgumentNullException(“control”);
if(parent.HasControls())
{
foreach(父控件中的控件childControl)
{
var候选者=作为TControl的childControl;
如果(candidate!=null)生成返回候选者;
foreach(FindDescents中的下一级变量(儿童控制))
{
下一级收益率;
}
}
}
}
}
然后做一些类似的事情:
foreach(var ctrl in Page.FindDescendants<HtmlInputText>())
{
ctrl.Attributes.Add("readonly","readonly");
}
foreach(Page.finddescents()中的var ctrl)
{
添加(“只读”、“只读”);
}
在页面上添加此功能:
void whatYouWannaDo (Control con)
{
foreach (Control c in con.Controls)
{
if (c.Controls.Count > 0)
whatYouWannaDo(c);
else
{
//Do stuff here
}
}
}
在这个递归函数中,可以执行任何操作。并通过将
whatYouWannaDo(Page.Controls)
添加到页面上来调用此函数:
void whatYouWannaDo (Control con)
{
foreach (Control c in con.Controls)
{
if (c.Controls.Count > 0)
whatYouWannaDo(c);
else
{
//Do stuff here
}
}
}
在这个递归函数中,可以执行任何操作。并将
whatYouWannaDo(Page.Controls)
为VB.NET道歉。我使用一些扩展方法来实现这一点。您还需要从nuget获取IEnumerable上的Each扩展方法(请尝试MoreLinq):
“”
''以序列形式返回控件和所有子体
'''
公共迭代器函数AsEnumerable(控件作为控件)作为IEnumerable(控件的)
Dim队列=新队列(控制)
队列。排队(控制)
排队时执行此操作。计数0
control=queue.Dequeue()
产量控制
对于控制中的每个c作为控件。控件
排队。排队(c)
下一个
环
端函数
公共子集InputControlStoreADonly(控件作为控件)
control.AsEnumerable().Each(Sub(c)
如果c的类型是TextBox,那么DirectCast(c,TextBox).ReadOnly=True
如果c的类型是ListControl,那么DirectCast(c,ListControl).Enabled=False
末端接头)
端接头
这允许您调用control.SetInputControlsToReadonly()。有时,您不希望将所有控件都设置为只读,只将页面上的一个部分设置为只读。在这种情况下,包装公司
''' <summary>
''' Returns the control and all descendants as a sequence
''' </summary>
<Extension>
Public Iterator Function AsEnumerable(control As Control) As IEnumerable(Of Control)
Dim queue = New Queue(Of Control)
queue.Enqueue(control)
Do While queue.Count <> 0
control = queue.Dequeue()
Yield control
For Each c As Control In control.Controls
queue.Enqueue(c)
Next
Loop
End Function
<Extension>
Public Sub SetInputControlsToReadonly(control As Control)
control.AsEnumerable().Each(Sub(c)
If TypeOf c Is TextBox Then DirectCast(c, TextBox).ReadOnly = True
If TypeOf c Is ListControl Then DirectCast(c, ListControl).Enabled = False
End Sub)
End Sub