【问题标题】:How are DataTextField and DataValueFields evaluated如何评估 DataTextField 和 DataValueFields
【发布时间】:2012-02-29 08:53:31
【问题描述】:

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

  • 控件如何在内部处理这些值,或者更确切地说,它们如何在不知道它们正在处理哪种数据源的情况下从数据源获取值。

  • 谁能用代码解释控件如何评估数据源中的这些字段。

【问题讨论】:

  • 他们的 DataSource 通常是 Object 类型而不是 IEnumerable 并且他们使用反射。 msdn.microsoft.com/en-us/library/ms173183(v=vs.80).aspx
  • @Lloyd 非常感谢您清除它,但在内部他们检查它是否是 IEnumerable,我想是 IList,因为我想无法枚举对象
  • 您可以遍历对象的属性,这就是您可以将对象绑定到详细信息视图等项目的方法
  • @Lloyd 我还不清楚,代码 sn-p 可能会清除我对反射用于获取值的疑问。

标签: asp.net datasource databound-controls


【解决方案1】:
  1. 通常,数据绑定控件(或相关组件,例如 DataControlField in GridView) 将处理 DataBinding 事件。

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

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

    李>

我会建议你使用Reflector之类的工具来检查相关控件的代码以获得更好的想法。

【讨论】:

  • 是的,我也想知道投反对票的原因,@vinay 已经在 SO 上回答了大多数与控制相关的问题(我的每一个)。
  • 如果我在 ascx 文件中的 UserControl 中公开转发器的 DataSource 属性,我应该什么时候调用 .DataBind() 方法。
  • @Deeptechtons,棘手的情况 - 尽可能晚地调用 DataBind 是有意义的(比如预渲染),但在回发场景中,您希望数据绑定尽早出现,以便状态为动态生成的控件将正确加载。更好的选择是在消费者设置 DataSource 属性后立即调用 data-bind。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2023-03-23
    相关资源
    最近更新 更多