DataTextField和DataValueFields是如何评估的

时间:2012-02-29 08:53:31

标签: asp.net datasource databound-controls

对于数据绑定控件,我们提供data text fielddata value field(在Dropdownlist之类的简单控件中)但在控件中提供更多字段的常见情况Gridview。通常,数据源的类型为IEnumerable

  • 控件如何在内部处理这些值,或者如何从数据源获取值,而不知道他们正在处理什么类型的数据源。

  • 有人可以用代码解释控件如何从数据源评估这些字段。

2 个答案:

答案 0 :(得分:0)

  1. 通常,数据绑定控件(或相关组件,如 GridView中的DataControlField将处理DataBinding事件。

  2. 在事件处理程序中,检索当前绑定的数据项(例如DataRowView或实体实例)。这是通过DataBinder.GetDataItem传递实际控件或控件的NamingContainer来完成的。例如,如果要为DataControlField等更高级别的数据绑定控件实现较低级别的控件(如GridView),那么它将处理单元格控件的数据绑定,因此它将使用单元格的命名要传递给DataBinder.GetDataItem方法的容器,该方法使用当前数据绑定上下文来获取相同内容。

  3. 一旦检索到数据项对象,就需要针对它来评估给定的数据绑定表达式以获取实际值,并根据设置到控件/组件的不同属性应用任何格式。最简单的方法是使用DataBinder.Eval重载。但是,可以使用更有效的方法 - 例如,假设DataField字符串将只是属性名称,那么您可以查看并缓存属性描述符,然后对不同的数据项使用相同的。

  4. 我建议您使用Reflector等工具检查相关控件的代码,以获得更好的想法。

答案 1 :(得分:0)

我从来不知道我能够如此轻松地找到这些信息,而且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控件开发的课程,以了解正在做什么。