我正在开发一个Web Forms项目,它将Sql查询的结果加载到DataTable中。
将这些DataTable传递到前端,我们将它们绑定到Repeater网络控件。
这很有效。但是,现在我们要绑定到我们自己的自定义类而不是DataTable
。不幸的是,我认为明显的答案是行不通的(在我们的课上实施IDictionary<string, object>
)。
我们需要将Eval绑定到Datum而不为每个绑定创建具体属性?显然,DataRow不必具体实现我们绑定的每个属性。因此,似乎Eval能够在DataRow上按名称查找属性值。
这是自定义类
public class Datum: IDictionary<string, object>
{
private Dictionary<string, object> _entries;
public Datum()
{
_entries = new Dictionary<string, object>();
}
public object this[string s]
{
get
{
return this._entries[s];
}
}
...
}
这是在aspx.cs文件中设置DataSource的地方
rptTags.DataSource = new[] { new Datum { {"Count", 1} }, new Datum { {"Count", 2 } };
这是aspx文件中的绑定
<asp:Repeater ID="rptTags" runat="server">
<ItemTemplate>
<%# (int)Eval("Count") >
</ItemTemplate>
</asp:Repeater>
使用上面的示例,我们得到一个错误,指出有问题的属性不存在,这是真的,但它也不存在于DataRow上。如何使它像System.Data.DataRow一样绑定?
答案 0 :(得分:1)
今天早上我带着新鲜的眼睛来到这里,用ILSpy花了几个小时浏览.Net Framework。我终于能够解决这个难题并实施一个有效的解决方案。我将列出我学到的与解决方案相关的内容,然后详细说明我的实现。
ICustomTypeDescriptor
接口之外,这并不重要。考虑到这一点,我需要采取的步骤来创建我自己的自定义类型,我可以像DataTable一样动态绑定。
答案 1 :(得分:0)
可绑定的DataSource应实现IEnumerable
或IListSource
。
关于动态方面:请记住,数据绑定的部分魔力是使用反射进行的。