0

在 ASP.NET 应用程序上工作,我的项目需要从页面中查找控件,使用以下语法从页面中查找控件:

public static Control FindControlRecursive(Control Root, string Id)
{
    Control FoundCtl = new Control();
    if (Root.ID == Id)
        return Root;

    foreach (Control Ctl in Root.Controls)
    {
        if (FoundCtl != null && FoundCtl.ID == Id)
        {
            
            Type ty = FoundCtl.GetType();
            var r = FoundCtl as ty; 
            
            //var r = FoundCtl as  Telerik.Web.UI.RadComboBox;   
        }

        FoundCtl = FindControlRecursive(Ctl, Id);

        //if (FoundCtl != null)
        //    return FoundCtl;
    }

    return FoundCtl;
}

为了从控件中检索控件值需要强制转换。对于演员使用波纹管语法

FoundCtl as TextBox;
                

是否可以按如下方式进行查找控制

Type ty = FoundCtl.GetType();
var r = FoundCtl as ty;
4

2 回答 2

1

最合适的方法如下:

TextBox textBox = FindControl("name") as TextBox;
if (textBox != null)
{
    // use it
}

为什么它不适合你?


您还可以使用扩展方法递归地查找给定类型的控件:

public static IEnumerable<Control> GetChildControls(this Control control)
{
    var children = (control.Controls != null) ? control.Controls.OfType<Control>() : Enumerable.Empty<Control>();
    return children.SelectMany(c => GetChildControls(c)).Concat(children);
}

用法:

var textBoxex = this.GetChildControls<TextBox>();
于 2012-12-06T05:43:24.887 回答
0

你不能这样做。所有强制转换运算符都不适用于 System.Type 类型的变量。此外,如果您想在运行时通过反射使用此控件,您可以使用反射方法来使用它(例如PropertyInfo.SetValue等)。但通常你非常清楚具体控制的类型。为什么要在运行时强制转换?

于 2012-12-06T05:42:03.120 回答