对于数据绑定控件,常见的场景是我们提供data text field
和data value field
(在简单控件中Dropdownlist
),但在控件中提供更多字段,例如Gridview
. 通常数据源是类型IEnumerable
。
控件如何在内部处理这些值,或者更确切地说,它们如何在不知道它们正在处理哪种数据源的情况下从数据源获取值。
有人可以用代码解释控件如何评估数据源中的这些字段。
对于数据绑定控件,常见的场景是我们提供data text field
和data value field
(在简单控件中Dropdownlist
),但在控件中提供更多字段,例如Gridview
. 通常数据源是类型IEnumerable
。
控件如何在内部处理这些值,或者更确切地说,它们如何在不知道它们正在处理哪种数据源的情况下从数据源获取值。
有人可以用代码解释控件如何评估数据源中的这些字段。
通常,数据绑定控件(或
DataControlField
GridView 等相关组件)将处理DataBinding事件。
DataRowView
在事件处理程序中,检索当前正在绑定的数据项(例如或实体实例)。这是通过传递实际控件或控件的NamingContainer的DataBinder.GetDataItem来完成的。例如,如果您正在实现较低级别的控件,例如更高级别的数据绑定控件,那么它将处理单元格控件的数据绑定,因此它将使用单元格的命名容器传递给使用当前数据绑定的方法获得相同的上下文。DataControlField
GridView
DataBinder.GetDataItem
检索到数据项对象后,需要针对它评估给定的数据绑定表达式以获取实际值并根据为控件/组件设置的不同属性应用任何格式。最简单的方法是使用DataBinder.Eval重载。但是,可以使用更有效的方法 - 例如,假设DataField
字符串只是属性名称,那么您可以查看并缓存属性描述符,然后对不同的数据项使用相同的描述符。
我会建议你使用 Reflector 之类的工具来检查相关控件的代码以获得更好的想法。
我从来不知道我可以如此轻松地找到这些信息,而 LLyod 实际上在使用反射从数据源中查找数据方面是错误的。当我检查时,没有一个数据控件使用它Reflector
;(
解决问题的链接
http://msdn.microsoft.com/en-us/library/ms366540.aspx
你是怎么做的
protected override void PerformDataBinding(IEnumerable retrievedData)
{
base.PerformDataBinding(retrievedData);
// Verify data exists.
if (retrievedData != null)
{
string dataStr = String.Empty;
foreach (object dataItem in retrievedData)
{
if (DataTextField.Length > 0)
{
dataStr = DataBinder.GetPropertyValue(dataItem,
DataTextField, null);
}
else
{
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(dataItem);
if (props.Count >= 1)
{
if (null != props[0].GetValue(dataItem))
{
dataStr = props[0].GetValue(dataItem).ToString();
}
}
}
}
}
}
如果上面的代码看起来像是希腊语和拉丁语,那么您将必须学习有关 asp.net 控件开发的课程才能了解正在做什么。