我的问题很直接。我正在使用带有c#的asp.net。
在我的页面中,我有许多控件,例如FlowLayout
, JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = new JPanel();
content.add(new JLabel("A Label"));
content.add(new JButton("A Button"));
frame.add(content);
frame.pack();
frame.setVisible(true);
,DropDownList
等。
在某些情况下,我想将控件重置为
GridView
我想要的是,我喜欢建立一个共同的Repeater
来重置所有控件,例如:
DropDownList1.DataSource = null;
DropDownList1.DataBind();
此处Method
可以是上述任何void SomeMethod(Template T)
{
T.DataSource = null;
T.DataBind();
}
。
我听说使用T
可以做到这一点,但我不知道怎么做!!!
所以请建议解决方案。
答案 0 :(得分:4)
您对混淆泛型方法在C#中的工作方式感到困惑。我不认为通用方法适用于此。您可以在这里阅读如何(以及何时)使用它们: https://msdn.microsoft.com/en-us/library/twcad0zb.aspx
至于您的特定情况,似乎大多数支持数据绑定的控件都来自BaseDataBoundControl。最简单的解决方案是创建一个接受BaseDataBoundControl作为参数的方法,如下所示:
void SomeMethod(BaseDataBoundControl control)
{
control.DataSource = null;
control.DataBind();
}
我从您的问题中看到的一个例外是Repeater。因为它不会从BaseDataBoundControl继承,所以我实现了一个重载方法,它接受Repeater类作为参数。
void SomeMethod(Repeater control)
{
control.DataSource = null;
control.DataBind();
}
结果是两个简单的方法,与代码中的其他地方具有相同的用法,无论您是对从BaseDataBoundControl或Repeater类派生的类型进行操作。
答案 1 :(得分:3)
首先,您必须从该类中找到常见的class
或interface
。从我的小研究来看,它是DataBoundControl
。
在此之后,您创建一个通用方法(如果您想使用模板)并为继承设置约束,如下所示。
void SomeMethod<T>(T dataControl) where T : DataBoundControl
{
T.DataSource = null;
T.DataBind();
}
注意:
使用DataBoundControl
仅适用于DropDownList
,GridView
以及从中继承的其他内容。 Repeater
直接从Control
类继承。
您可以将此方法用作extension method。
答案 2 :(得分:2)
您可以将其作为扩展方法,因此所有GridBoundControl都具有可用的方法:
internal static class ExtenstionMethods
{
internal static void ClearData( this DataBoundControl control )
{
control.DataSource = null;
control.DataBind();
}
}
然后您可以将其称为:
grdReports.ClearData();
ddlAnswers.ClearData();
etc.