Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中将动态控件作为参数传递给用户定义的方法_C#_Asp.net_Dynamic Controls - Fatal编程技术网

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

C# 在c中将动态控件作为参数传递给用户定义的方法,c#,asp.net,dynamic-controls,C#,Asp.net,Dynamic Controls,我的问题很简单。我正在使用asp.net和c 在我的页面中,我有许多控件,如DropDownList、GridView、Repeater等 在某些情况下,我想将控件重置为 DropDownList1.DataSource = null; DropDownList1.DataBind(); 我想要的是,我想建立一个重置所有控件的通用方法,如: void SomeMethod(Template T) { T.DataSource = null; T.DataBind(); } 这

我的问题很简单。我正在使用asp.net和c

在我的页面中,我有许多控件,如DropDownList、GridView、Repeater等

在某些情况下,我想将控件重置为

DropDownList1.DataSource = null;
DropDownList1.DataBind();
我想要的是,我想建立一个重置所有控件的通用方法,如:

void SomeMethod(Template T)
{
    T.DataSource = null;
    T.DataBind();
}
这里的T可以是上述任何asp控件

我听说这可以使用模板类型,但我不知道如何


因此,请建议解决方案。

首先,您必须从这些类中找到公共类或接口。从我的小研究来看,它是

在此之后,如果要使用模板并为继承设置约束,请创建一个泛型方法,如下所示

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

使用将仅适用于DropDownList、GridView和从中继承的其他。中继器直接从控件类继承

您可以将此方法用作一个示例


您混淆了C中泛型方法的工作原理。我认为泛型方法在这里不适用。您可以在此处了解如何以及何时使用它们:

至于您的特殊情况,似乎大多数支持数据绑定的控件都是从中派生出来的。最简单的解决方案是创建一个接受BaseDataBoundControl作为参数的方法,如下所示:

void SomeMethod(BaseDataBoundControl control)
{
    control.DataSource = null;
    control.DataBind();
}
我从你的问题中看到的一个例外是。因为它不是从BaseDataBoundControl继承的,所以我将实现一个重载方法,该方法接受Repeater类作为参数

void SomeMethod(Repeater control)
{
    control.DataSource = null;
    control.DataBind();
}

结果是两个简单的方法在代码中的其他地方具有相同的用法,无论您是对从BaseDataBoundControl派生的类型还是对Repeater类进行操作。

您可以将其作为扩展方法进行操作,以便所有GridBoundControl都可以使用该方法:

internal static class ExtenstionMethods
{
    internal static void ClearData( this DataBoundControl control )
    {
        control.DataSource = null;
        control.DataBind();
    }
}
你可以这样称呼它:

grdReports.ClearData();
ddlAnswers.ClearData();
etc.

回答得好+1此外,您还可以添加OP如何轻松调用此方法: