将动态控件作为参数传递给 C# 中的用户定义方法
Passing dynamic control as argument to user defined method in c#
我的问题很简单。我正在使用 asp.net 和 c#。
在我的页面中有很多控件,例如 DropDownList
、GridView
、Repeater
等
并且在某些情况下我想将控件重置为
DropDownList1.DataSource = null;
DropDownList1.DataBind();
我想要什么,我喜欢构建一个通用的 Method
来重置所有控件,例如:
void SomeMethod(Template T)
{
T.DataSource = null;
T.DataBind();
}
这里的T
可以是上面提到的任何一个asp controls
。
我听说使用 Template Type
可以做到这一点,但我不知道怎么做!!!
所以请提出解决方案。
首先,您必须从 class 中找到共同的 class
或 interface
。根据我的小研究,它是 DataBoundControl
。
在此之后你创建一个通用方法(如果你想使用模板)并为继承设置一个约束,如下所示。
void SomeMethod<T>(T dataControl) where T : DataBoundControl
{
T.DataSource = null;
T.DataBind();
}
备注:
使用 DataBoundControl
仅适用于 DropDownList
、GridView
和其他从它继承的。 Repeater
直接继承自 Control
class.
您可以将此方法用作 extension method。
您混淆了泛型方法在 C# 中的工作方式。我认为通用方法不适用于此处。您可以在此处阅读有关如何(以及何时)使用它们的信息:
https://msdn.microsoft.com/en-us/library/twcad0zb.aspx
至于您的具体情况,似乎大多数支持数据绑定的控件都派生自BaseDataBoundControl。最简单的解决方案是创建一个接受 BaseDataBoundControl 作为参数的方法,如下所示:
void SomeMethod(BaseDataBoundControl control)
{
control.DataSource = null;
control.DataBind();
}
我从你的问题中看到的一个例外是 Repeater。因为它不继承自 BaseDataBoundControl,所以我将实现一个重载方法,该方法接受 Repeater class 作为参数。
void SomeMethod(Repeater control)
{
control.DataSource = null;
control.DataBind();
}
结果是两个简单的方法,它们在代码的其他地方具有相同的用法,无论您是对从 BaseDataBoundControl 还是 Repeater 派生的类型进行操作 class。
您可以将其作为扩展方法来实现,这样所有 GridBoundControls 都可以使用该方法:
internal static class ExtenstionMethods
{
internal static void ClearData( this DataBoundControl control )
{
control.DataSource = null;
control.DataBind();
}
}
你可以这样称呼它:
grdReports.ClearData();
ddlAnswers.ClearData();
etc.
我的问题很简单。我正在使用 asp.net 和 c#。
在我的页面中有很多控件,例如 DropDownList
、GridView
、Repeater
等
并且在某些情况下我想将控件重置为
DropDownList1.DataSource = null;
DropDownList1.DataBind();
我想要什么,我喜欢构建一个通用的 Method
来重置所有控件,例如:
void SomeMethod(Template T)
{
T.DataSource = null;
T.DataBind();
}
这里的T
可以是上面提到的任何一个asp controls
。
我听说使用 Template Type
可以做到这一点,但我不知道怎么做!!!
所以请提出解决方案。
首先,您必须从 class 中找到共同的 class
或 interface
。根据我的小研究,它是 DataBoundControl
。
在此之后你创建一个通用方法(如果你想使用模板)并为继承设置一个约束,如下所示。
void SomeMethod<T>(T dataControl) where T : DataBoundControl
{
T.DataSource = null;
T.DataBind();
}
备注:
使用
DataBoundControl
仅适用于DropDownList
、GridView
和其他从它继承的。Repeater
直接继承自Control
class.您可以将此方法用作 extension method。
您混淆了泛型方法在 C# 中的工作方式。我认为通用方法不适用于此处。您可以在此处阅读有关如何(以及何时)使用它们的信息: https://msdn.microsoft.com/en-us/library/twcad0zb.aspx
至于您的具体情况,似乎大多数支持数据绑定的控件都派生自BaseDataBoundControl。最简单的解决方案是创建一个接受 BaseDataBoundControl 作为参数的方法,如下所示:
void SomeMethod(BaseDataBoundControl control)
{
control.DataSource = null;
control.DataBind();
}
我从你的问题中看到的一个例外是 Repeater。因为它不继承自 BaseDataBoundControl,所以我将实现一个重载方法,该方法接受 Repeater class 作为参数。
void SomeMethod(Repeater control)
{
control.DataSource = null;
control.DataBind();
}
结果是两个简单的方法,它们在代码的其他地方具有相同的用法,无论您是对从 BaseDataBoundControl 还是 Repeater 派生的类型进行操作 class。
您可以将其作为扩展方法来实现,这样所有 GridBoundControls 都可以使用该方法:
internal static class ExtenstionMethods
{
internal static void ClearData( this DataBoundControl control )
{
control.DataSource = null;
control.DataBind();
}
}
你可以这样称呼它:
grdReports.ClearData();
ddlAnswers.ClearData();
etc.