需要通用实用工具C#方法来填充ASP.NET DropDownList
在实用程序类中,我有一个如下所示的方法。我想更改参数dataSource以接受任何类型的数据源,即DataSet、DataView、List、DataTable和ArrayList 这可能吗?我将如何更改方法签名(以及参数和类型),以允许灵活地传入任何可接受的数据源进行绑定需要通用实用工具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
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