【问题标题】:Need generic utility C# method for populating ASP.NET DropDownList需要通用实用程序 C# 方法来填充 ASP.NET DropDownList
【发布时间】:2010-12-26 01:31:42
【问题描述】:

我在实用程序类中有如下方法。我想更改参数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);
}

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    好吧,由于DropDownList 上的DataSource 属性具有object 类型,您可以更改方法签名以接受object。这不会使您的方法具有通用性(在 .NET 意义上),但无论如何可能就足够了。

    【讨论】:

    • +1。由于没有可用作泛型约束的所有数据源的通用接口,因此在这种情况下使用泛型没有任何优势。
    【解决方案2】:

    我相信您正在寻找以下内容。

    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);
    
    }
    

    【讨论】:

    • 在这种情况下使用泛型有什么好处?是的,大卫要求他们,但我想他可以很容易地自己编写这段代码。而且它并没有给他任何比接受一个对象的好处。
    • 我认为我对问题标题中的“通用”一词读得太远了。我想我设法将通用解决方案变成了具有泛型的解决方案:) 无论哪种方式,它都有效。
    • @Adam:哎呀,我还以为大卫要求泛型,但在阅读了您的评论后,我回到它,发现可能我错了。谢谢:)
    • 你也可以在数据绑定前清除下拉列表中的项目
    【解决方案3】:

    我的库中有类似的东西,我所做的是将它创建为 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#。

    【讨论】:

    • 问题解决了另一个问题。
    • 并非如此。我提到了扩展方法,但我展示了我如何处理需要接受任何类型的数据源的类似情况。由于 DropDownList 控件的 .DataSource 属性属于 Object 类型,因此我将其包装在函数的参数列表中。
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多