Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:使用runat=”获取所有控件;服务器";_C#_Asp.net - Fatal编程技术网

C#:使用runat=”获取所有控件;服务器";

C#:使用runat=”获取所有控件;服务器";,c#,asp.net,C#,Asp.net,我有很多带有很多控件的.aspx页面。这些控件都以类似的方式声明: <input type="text" runat="server" id="txtLatitude" /> 但是,对于每个页面中的每个控件,手动执行该操作将花费我很多时间。我想知道是否有办法通过runat=“server”获取所有控件的列表或其他内容。 我试着用 ControlCollection myControls = Page.Controls 为了得到它们,我在调试模式下查看了myControls,它似乎

我有很多带有很多控件的.aspx页面。这些控件都以类似的方式声明:

<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