使用DataBinder.GetPropertyValue()进行数据绑定

时间:2009-11-23 20:58:16

标签: c# .net data-binding

嗨 - 我有一个非常简单的数据绑定问题(从编写数据可绑定控件的一面)让我感到困惑。

查看.NET源代码,似乎大多数数据绑定都是通过DataBinder.GetPropertyValue()方法抽象的。此方法采用对象和属性名称,该方法将通过TypeDescriptor或反射或其他方式查找值。这在IListSource(如DataSet)上运行得很好,但我无法使用XmlNode对象。我知道你可以将一个XmlNodeList绑定到ASP.NET中的数据源,所以我希望这可以工作。这是代码:

class Program
{
   static void Main(string[] args)
   {
      XmlDocument doc = new XmlDocument();
      doc.Load("Data.xml");
      IEnumerable list = doc.SelectNodes("/Data/Row");

      foreach (object item in list)
      {
         object val = DataBinder.GetPropertyValue(item, "Number"); //Expect to see “1”, “2” and “3”
      }
   }
}

Data.xml是:

<?xml version="1.0" encoding="utf-8" ?>
<Data>
   <Row Number="1" />
   <Row Number="2" />
   <Row Number="3" />
</Data>

当我调用GetPropertyValue时,我得到了这个例外:

DataBinding:'System.Xml.XmlElement'不包含名为'Number'的属性。

在我的Data Binding循环中,我只想循环遍历任何IEnumerable - 我不想特殊情况下的XmlNode类型。诸如DropdownList之类的控件将特殊情况IListSource并进行一些转换,但是其他IEnumerables看起来像是被视为原样。谢谢!

2 个答案:

答案 0 :(得分:0)

首先,我将使用var而不是对象,将每个节点转换为对象。

foreach (var item in list)
{
    object val = DataBinder.GetPropertyValue(item, "Number"); //Expect to see “1”, “2” and “3”
}
// this isn't going to work...

然后我必须检查,但我不认为你会有一个名为Number的属性。你可能有一个属性调用属性,这是一个你可以调用的字典:

//object val = DataBinder.GetPropertyValue(item, "Attributes")["Number"].Value;
// this isn't going to work either...

如果你想要做的只是在节点上获取该属性的值,那么使用:

for (int index = 0; index < nodes.Count; index++)
{
    var value = nodes.Item(index).Attributes["Number"].Value;
}

System.Web.UI.DataBinder通常用于asp.net页面的html部分。我从未在static void Main()内使用它。

修改

我在google搜索后发现了一个链接:“databound dropdownlist to xml”我认为可能有所帮助。

ASP Net - databinding xml to dropdownlist

答案 1 :(得分:0)

我跟踪它是正确的,XmlDocument不可绑定,因为XmlNode没有实现属性描述符。根据我的消息来源,有人已经谈过这样做了好几年,但还没有发生。但是,XmlDataSource类实际上提供了此功能。诀窍是从你的XmlDocument创建一个XmlDataSource并绑定到它,这将完美地工作..

XmlDocument doc = new XmlDocument();
doc.Load("Data.xml");

XmlDataSource source = new XmlDataSource();
source.Data = doc.OuterXml;
source.EnableCaching = false;
source.DataBind();

DropDownList dd = new DropDownList();
dd.DataSource = source;
dd.DataTextField = "Number";
dd.DataBind();