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

C# 使用DataBinder.GetPropertyValue()进行数据绑定,c#,.net,data-binding,C#,.net,Data Binding,您好–我有一个非常直接的数据绑定问题,来自编写数据绑定控件方面,这让我感到困惑 查看.NET源代码,似乎大多数数据绑定都是通过DataBinder.GetPropertyValue方法进行抽象的。该方法接受一个对象和一个属性名,该方法将通过TypeDescriptor或reflection或其他方式查找值。这在诸如DataSet之类的IListSource上非常有效,但是我无法让它与XmlNode对象一起工作。我知道您可以将XmlNodeList绑定到ASP.NET中的数据源,所以我希望它能正常

您好–我有一个非常直接的数据绑定问题,来自编写数据绑定控件方面,这让我感到困惑

查看.NET源代码,似乎大多数数据绑定都是通过DataBinder.GetPropertyValue方法进行抽象的。该方法接受一个对象和一个属性名,该方法将通过TypeDescriptor或reflection或其他方式查找值。这在诸如DataSet之类的IListSource上非常有效,但是我无法让它与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时,会出现以下异常:

数据绑定:“System.Xml.xmlement”不包含名为“Number”的属性


在我的数据绑定循环中,我只想循环任何IEnumerable–我不想对XmlNode类型进行特殊处理。DropdownList之类的控件将使用特殊情况的IListSource并进行一些转换,但其他IEnumerables看起来像是按原样处理的。谢谢

首先,我将使用var而不是object,以便将每个节点强制转换为一个对象

foreach (var item in list)
{
    object val = DataBinder.GetPropertyValue(item, "Number"); //Expect to see “1”, “2” and “3”
}
// this isn't going to work...
那我就得检查一下,但我不认为你会有一个叫号码的房子。您可能有一个属性调用Attributes,它是一个字典,您可以调用:

//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;
}
通常用于asp.net页面的html部分。我从来没有在静态真空总管内使用过它

编辑:

我在谷歌搜索后发现了一个链接:databounddropdownlist到xml,我认为这可能会有所帮助


我查到了这一点,它是正确的,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();

如果你这样做,你就是一个特殊的节点。我希望能够传入数据行、哈希表等的IEnumerable。基本上,您可以在ASP.NET中绑定到数据源的任何内容。正如我所说,我不希望假定IEnumerable是一个XmlNode。我想让它和任何东西一起工作。。无论如何,谢谢。实际上我可能完全错了,我只是尝试通过添加以下代码将数据绑定到DropDownList对象:DropDownList dd=new DropDownList;dd.DataSource=列表;dd.DataTextField=编号;dd.数据绑定;我在数据绑定上得到了同样的异常。ASP.NET数据绑定控件是否不支持将数据绑定到XmlDocument?我可以发誓他们真的…谢谢!我的问题是如何实际/编写/一个这样做的控件,而不是如何使用DropDownList控件。总之,我找到了正确的答案。只是一个建议,如果你找到了答案,你可以自己贴出来,并把它标记为答案。。。我建议你提问时不要在任何建议上做记号,因为回答的人将不再在你的问题上发表建议。