需要通用实用工具C#方法来填充ASP.NET DropDownList

需要通用实用工具C#方法来填充ASP.NET DropDownList,c#,asp.net,C#,Asp.net,在实用程序类中,我有一个如下所示的方法。我想更改参数dataSource以接受任何类型的数据源,即DataSet、DataView、List、DataTable和ArrayList 这可能吗?我将如何更改方法签名(以及参数和类型),以允许灵活地传入任何可接受的数据源进行绑定 public void FillCombo(DropDownList ddl, DataTable dataSource, string textField, string valueField, bool addSelec

在实用程序类中,我有一个如下所示的方法。我想更改参数dataSource以接受任何类型的数据源,即DataSet、DataView、List、DataTable和ArrayList

这可能吗?我将如何更改方法签名(以及参数和类型),以允许灵活地传入任何可接受的数据源进行绑定

public void FillCombo(DropDownList ddl, DataTable dataSource, string textField, string valueField, bool addSelect) {
    ddl.DataValueField = valueField;
    ddl.DataTextField = textField;
    ddl.DataSource = dataSource;
    ddl.DataBind();
    if (addSelect) 
        AddSelectCombo(ddl, "Select", -1);
}

我相信以下是你想要的

public void FillCombo<TSource>(DropDownList ddl, TSource dataSource, string textField, string valueField, bool addSelect) {

    ddl.DataValueField = valueField;
    ddl.DataTextField = textField;
    ddl.DataSource = dataSource;
    ddl.DataBind();

    if (addSelect) AddSelectCombo(ddl, "Select", -1);

}
public void FillCombo(DropDownList ddl、TSource dataSource、string textField、string valueField、bool addSelect){
ddl.DataValueField=valueField;
ddl.DataTextField=textField;
ddl.DataSource=数据源;
ddl.DataBind();
如果(addSelect)AddSelectCombo(ddl,“Select”,-1);
}

由于
下拉列表上的
数据源
属性具有类型
对象
,因此可以更改方法签名以接受
对象
。这不会使您的方法具有通用性(在.NET意义上),但无论如何,它可能已经足够了。

我的库中有类似的东西,我所做的是在DropDownList类上将其创建为扩展方法(.NET 3.5+)

Imports WC = System.Web.Controls   

公共子索引(
ByVal目标作为WC.DropDownList,ByVal数据源作为对象,
ByVal DataTextField作为字符串,ByVal DataValueField作为字符串,
可选的ByVal设置工具提示为布尔值=True
)
有目标
.DataSource=数据源
.DataTextField=DataTextField
.DataValueField=DataValueField
.DataBind()
以
如果设置工具提示,则
对于target.Items中的每个li作为ListItem
li.Attributes(“title”)=li.Text
下一个
如果结束
端接头

我把它留给你翻译成C#。

+1。由于所有数据源都没有可用作泛型约束的公共接口,所以在这种情况下使用泛型并没有任何好处。问题解决了另一个问题。事实并非如此。我提到了扩展方法,但我展示了如何处理需要接受任何类型数据源的类似情况。由于DropDownList控件的.DataSource属性是Object类型,因此我将其包装到函数的参数列表中。在这种情况下使用泛型有什么好处?是的,大卫要求他们,但我想他可以自己写这段代码很容易。我想我对问题标题中的“泛型”一词读得太多了。我想我成功地把一个泛型解决方案变成了一个带有泛型的解决方案:)不管怎样,它都是有效的。@Adam:哎呀,我还以为David要的是泛型,但读了你的评论后,我又回到了它,发现我可能错了。谢谢:)您还可以在数据绑定之前清除下拉列表中的项目
<Extension()> Public Sub DataBindEx(
    ByVal target As WC.DropDownList, ByVal DataSource As Object, 
    ByVal DataTextField As String, ByVal DataValueField As String,
    Optional ByVal SetTooltips As Boolean = True
)
    With target
        .DataSource = DataSource
        .DataTextField = DataTextField
        .DataValueField = DataValueField
        .DataBind()
    End With

    If SetTooltips Then
        For Each li As ListItem In target.Items
            li.Attributes("title") = li.Text
        Next
    End If
End Sub