嗨 - 我有一个非常简单的数据绑定问题(从编写数据可绑定控件的一面)让我感到困惑。
查看.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看起来像是被视为原样。谢谢!
答案 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”我认为可能有所帮助。
答案 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();