如何转换为页面上找到的控件

时间:2012-12-06 04:59:53

标签: c# asp.net reflection casting findcontrol

使用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;

如果有任何疑问,请先询问,谢谢

2 个答案:

答案 0 :(得分: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>();

答案 1 :(得分:0)

你不能这样做。所有强制转换操作符都不适用于System.Type类型的变量。此外,如果您希望在运行时使用反射使用此控件,则可以使用反射方法来处理它(例如PropertyInfo.SetValue等)。 但通常你会大肆知道具体控制的类型。你为什么要在运行时强制转换?