C#查找控件,转换,优雅的代码

问题描述 投票:0回答:2

我正在写一个ASPX / C#应用程序。它使用gridviews和模板字段以及它们的控件。要访问动态控件,我使用的是findcontrol方法,一切正常。

但随着应用程序变得越来越大,我可以看到代码在不同的功能/按钮点击事件中找到重复的控件。我认为创建一个基于传递给它的参数的控件的通用函数会很好。我是一个c#初学者,需要知道这是否可能?或者必须指定控制类型?

这就是我正在使用的(该功能未经过测试,因此可能是一个有缺陷的想法)。

点击事件中的代码:

    Button btn = (Button)sender;   
    GridViewRow gvr = (GridViewRow)btn.NamingContainer;
    TextBox details = gvr.FindControl("detailsText") as TextBox;
    //do something with details 
    TextBox cusID = gvr.FindControl("TextBox2") as TextBox;
    // do something with cusID 

我想写的功能

   protected Control Returncontrol(GridViewRow gvr, String ControlName)
{
    TextBox aCon = gvr.FindControl(ControlName) as TextBox;
    // This bit is what I am not sure about. Is possible to find the control without specifying what type of control it is? 
    return aCon;
}

这就是我打算使用这个功能的方法:

Returncontrol(gvr, TextBox2).text ="Something";
c# asp.net
2个回答
3
投票

您可以使用泛型类型参数创建方法,并且调用者可以指定期望的控件类型:

protected TControl Returncontrol<TControl>(GridViewRow gvr, String ControlName) 
                                                                  where TControl : Control
{
    TControl control = gvr.FindControl(ControlName) as TControl;

    return control;
}

现在你将使用它像:

TextBox txtBox = ReturnControl<TextBox>(grid1,"TextBox1");

现在您可以访问TextBox类型上可用的属性和方法:

if(txtBox!=null)
    txtBox.Text ="Something";

您还可以在GridViewRow类型上为此创建扩展方法,如下所示:

public static class GridViewRowExtensions
{
   public static TControl Returncontrol<TControl>(this GridViewRow gvr, String ControlName) where TControl : Control
   {
        TControl control = gvr.FindControl(ControlName) as TControl;

        return control;
   }
}

现在你可以使用GridViewRow的实例直接调用它:

TextBox txtBox = gvr.ReturnControl<TextBox>("TextBox1");

if(txtBox!=null)
    txtBox.Text="Some Text";

希望它能让您了解如何实现您的目标。


2
投票

您可以使用扩展方法创建一个静态助手类:

public static class ControlHelper
{
    public static T GetCtrl<T>(this Control c, string name) where T : Control
    {
        return c.FindControl(name) as T;
    }
}

然后你可以像这样使用它:

using _namespace_of_ControlHelper_ ;

// ...
TextBox txtBox = gvr.GetCtrl<TextBox>("TextBox1");
© www.soinside.com 2019 - 2024. All rights reserved.