【问题标题】:C# ControlCollection Extension GetAllTextboxesC# ControlCollection 扩展 GetAllTextboxes
【发布时间】:2010-12-05 16:44:30
【问题描述】:

我怎样才能只获取 ControlCollection 中的 texbox?

我试试:

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controlCollection)
{
    return (IEnumerable<TextBox>)controlCollection.Cast<Control>().Where(c => c is TextBox);
}

但我收到以下错误: 无法将“WhereEnumerableIterator`1[System.Web.UI.Control]”类型的对象转换为“System.Collections.Generic.IEnumerable`1[System.Web.UI.WebControls.TextBox]”类型。

我使用带有 C# 的 Asp.Net 3.5

【问题讨论】:

    标签: asp.net c#-3.0 controlcollection


    【解决方案1】:

    您实际上并不需要一种新的扩展方法 - 已经有一个可以满足您的需要:

    controlCollection.OfType<TextBox>();
    

    OfType method 返回所提供序列的序列 (IEnumerable&lt;T&gt;) 子集。如果类型不可转换,则将其排除在外。与大多数 LINQ 扩展方法不同,OfType 可用于非强类型序列:

    此方法是少数可应用于具有非参数化类型(例如 ArrayList)的集合的标准查询运算符方法之一。这是因为 OfType)>) 扩展了 IEnumerable 类型。

    或者如果你确实想把它包装在一个扩展方法中,当然很简单:

    public static IEnumerable<TextBox> TextBoxes(this ControlCollection controls)
    {
        return controls.OfType<TextBox>();
    }
    

    【讨论】:

    • 这实际上比我需要的更好!
    【解决方案2】:

    你想要 OfType():

    public static IEnumerable<TextBox> TextBoxes(this ControlCollection controlCollection)
    {
        return controlCollection.OfType<TextBox>();
    }
    

    【讨论】:

    • 感谢您的建议
    【解决方案3】:

    这是一种递归扩展方法,用于获取从指定类型下降的Control 对象,包括嵌套在控件层次结构中的对象。

    public static class ControlCollectionExtensions
    {
        public static IEnumerable<T> OfTypeRecursive<T>(this ControlCollection controls) where T : Control
        {
            foreach (Control c in controls)
            {
                T ct = c as T;
    
                if (ct != null)
                    yield return ct;
    
                foreach (T cc in OfTypeRecursive<T>(c.Controls))
                    yield return cc;
            }
        }
    }
    

    (对于 Windows 窗体而不是 ASP.NET,将 Control.ControlCollection 替换为 ControlCollection。)

    【讨论】:

    【解决方案4】:
    foreach (TextBox tBox in controls)
    {
    
    }
    

    例子:

    public static void HideControls<T>(Form pForm)
    {
        foreach (T cont in pForm.Controls)
        {
            cont.Visible = false;
        }
    }
    
    HideControls<TextBox>(this);
    HideControls<CheckedListBox>(this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多