将动态控制作为参数传递给c#中的用户定义方法

时间:2015-12-15 11:28:29

标签: c# asp.net dynamic-controls

我的问题很直接。我正在使用带有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可以做到这一点,但我不知道怎么做!!!

所以请建议解决方案。

3 个答案:

答案 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)

首先,您必须从该类中找到常见的classinterface。从我的小研究来看,它是DataBoundControl

在此之后,您创建一个通用方法(如果您想使用模板)并为继承设置约束,如下所示。

void SomeMethod<T>(T dataControl) where T : DataBoundControl
{
     T.DataSource = null;
     T.DataBind();
}

注意:

  1. 使用DataBoundControl仅适用于DropDownListGridView以及从中继承的其他内容。 Repeater直接从Control类继承。

  2. 您可以将此方法用作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.