需要一个通用的C#方法来填充ASP.NET DropDownList控件。

4

我有一个类似于以下代码的方法,现在我想将参数dataSource更改为接受任何类型的数据源,包括DataSet、DataView、List<T>、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);
}
3个回答

8

好的,既然在DropDownList上的DataSource属性具有object类型,那么您可以更改方法签名以接受一个object。这不会使您的方法成为泛型(在.NET中的意义),但也许已经足够了。


+1. 由于没有适用于所有数据源用作泛型约束的通用接口,因此在这种情况下使用泛型没有任何优势。 - Roman Boiko

3
我相信以下是你要找的内容。
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);

}

1
在这种情况下使用泛型的优点是什么?是的,David 要求使用它们,但我想他可以很容易地自己编写这段代码。并且与接受对象相比,它并没有给他带来任何好处。 - Roman Boiko
1
我觉得我在问题标题中对“通用”一词的理解过深了。我想我成功地将一个通用解决方案变成了一个带有泛型的解决方案 :) 无论哪种方式,它都能正常工作。 - Adam Maras
@Adam:哎呀,我也以为David要求泛型,但是在读了你的评论后,我重新看了一下,发现我可能错了。谢谢 :) - Roman Boiko
您也可以在数据绑定之前清除下拉列表的项目。 - Zo Has

0

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

Imports WC = System.Web.Controls   

...

<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

我会让你来将它翻译成C#。


问题涉及不同的问题。 - Roman Boiko
不完全是。我提到了扩展方法,但我展示的是如何处理类似情况的方式,即需要接受任何类型的数据源。由于DropDownList控件的.DataSource属性是Object类型,因此我在函数的参数列表中将其包装为Object类型。 - eidylon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接