Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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# 如何检查控件是否为某一类型?_C#_Asp.net - Fatal编程技术网

C# 如何检查控件是否为某一类型?

C# 如何检查控件是否为某一类型?,c#,asp.net,C#,Asp.net,当我使用下面的代码时,它是有效的。所有控件都是隐藏的 foreach (Control ctr in eItem.Controls) { ctr.visible = false; } 但是,我只想隐藏标签和下拉列表。这就是为什么我试图使用下面的代码却没有成功 foreach (Control ctr in eItem.Controls) { if(ctr is Label | ctr is DropDownList) {

当我使用下面的代码时,它是有效的。所有控件都是隐藏的

foreach (Control ctr in eItem.Controls)
{
    ctr.visible = false;                  
}
但是,我只想隐藏标签和下拉列表。这就是为什么我试图使用下面的代码却没有成功

foreach (Control ctr in eItem.Controls)
{
    if(ctr is Label | ctr is DropDownList)
    {
       ctr.visible = false;
    }              
}
编辑

这里是整个方法

 private void HideLabelAndDDLOnPageLoad()
    {
        foreach (ListViewItem eItem in lsvTSEntry.Items)
        {
            foreach (Control ctr in eItem.Controls)
            {
                if (ctr is Label || ctr is DropDownList)
                {
                    ctr.Visible = false;
                }  
            }
        }
    }
当我删除if时,所有控件都被隐藏。当我把它放回去时,什么也没发生


感谢您的帮助

我想您想要的是
|
将其更改为
|
…这是逻辑or运算符

foreach (Control ctr in eItem.Controls)
{
    if(ctr is Label || ctr is DropDownList)
    {
       ctr.Visible = false;
    }              
}
 if(ctr is Label || ctr is DropDownList)
|
=按位运算符

|
=逻辑或运算符

根据您的编辑 如果要循环updatepanel的内容模板容器中的所有控件,则控件似乎位于
updatepanel

给你:

foreach (Control ctr in UpdatePanel1.ContentTemplateContainer.Controls)
 {
  // rest of code
   if(ctr is Label || ctr is DropDownList)
     {
        ctr.Visible = false;
     }         
 }  

如果没有精确的标记,我们只能猜测解决方案

您必须使用另一个容器将控件包装在ListView中的ItemTemplate中,类似于面板或其他容器。当您获得列表视图项上的控件时,实际上得到的是扭曲容器,而不是它的子对象(标签、下拉列表等) 解决这个问题的一个办法是:

foreach (ListViewItem item in lsvTSEntry.Items)
{
    item.FindControl("myLabel").Visible = false;
    item.FindControl("myDropdownList").Visible = false;
}
基本上,您尝试按id查找控件并隐藏它们。请注意,这里没有错误检查,因此如果FindControl返回null,您可能会得到一个NullReferenceException

如果ItemTemplate中有嵌套容器,并且希望隐藏所有标签和下拉列表,而不管它们在何处,则可以实现自己的递归FindControl,如下所示:

private Control FindControlRecursive(Control rootControl, string controlId)
{
    if (rootControl.ID == controlId)
    {
        return rootControl;
    }

    foreach (Control controlToSearch in rootControl.Controls)
    {
        Control controlToReturn = FindControlRecursive(controlToSearch, controlId);
        if (controlToReturn != null)
        {
            return controlToReturn;
        }
    }

    return null;
}
不是最优雅的,但是。。。。当然,为了提高速度,您可以将其更改为获取一个Id数组。
当然,基于此,您可以实现按控件类型搜索,而不是将controlId作为参数,而是按要查找的控件类型进行搜索

是按位or运算符。 您正在寻找| |,逻辑or运算符

foreach (Control ctr in eItem.Controls)
{
    if(ctr is Label || ctr is DropDownList)
    {
       ctr.Visible = false;
    }              
}
 if(ctr is Label || ctr is DropDownList)

你说的“没有成功”是什么意思?发生了什么,你想发生什么?你为什么用|而不是| |?(你不必使用| |,但它更惯用。)@Richard…你收到错误消息了吗?请发布错误我已将|更改为| |,没有错误,但我要禁用的所有控件仍在那里。@Richard77:如果没有错误,那么发布的代码就不是正在运行的代码-应该是编译时错误。请发布您的真实代码。您能显示
列表视图
控件的标记吗?不,
|
可以。它不会短路,但会起作用。我投了反对票——这绝对不是问题所在。它不是惯用的,但它是有效的代码,将给出完全相同的结果。@JonSkeet-fair结果是相同的,但您必须查看它,以确定对正在执行的操作使用什么运算符。这里的逻辑运算符是有意义的,您的下一票倾向于不同意这一点,这绝对不值得下一票,因为不,我在哪里提到使用
|
是错误的,我建议使用什么。你太挑剔了。@john:你的回答有助于OP解决他们的问题吗?绝对不是——但这意味着确实如此。如果你说:“这不会有任何效果,但是你应该用
|
而不是
|
来表达你的习惯用语”,那么那将是另一回事——尽管那将是一个注释而不是答案。@john:是的,这更像是一个问题。绝对不是问题。看我的答案。@JonSkeet,这不值得投反对票+1 Marty,运算符的可读性和正确使用更像它。@john:
|
的使用是正确的-它是有效的代码,结果是一样的。我不相信这个答案(或其他类似的答案)有助于OP解决他们的问题。对于代码样式的注释,如果实际上没有解决问题,则最好作为注释。