我正在写一个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";
您可以使用泛型类型参数创建方法,并且调用者可以指定期望的控件类型:
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";
希望它能让您了解如何实现您的目标。
您可以使用扩展方法创建一个静态助手类:
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");