2009-11-23 3 views
0

Salut - J'ai une question de liaison de données assez simple (du côté de l'écriture des commandes de liaison de données) qui m'a confondu.Liaison de données à l'aide de DataBinder.GetPropertyValue()

En regardant le code source .NET, il semble que la plupart des liaisons de données sont extraites via la méthode DataBinder.GetPropertyValue(). Cette méthode prend un objet et un nom de propriété, et la méthode trouvera la valeur via un TypeDescriptor ou une réflexion ou autre. Cela fonctionne très bien sur un IListSource tel que DataSet, mais je n'arrive pas à le faire fonctionner avec un objet XmlNode. Je sais que vous pouvez lier un XmlNodeList à une source de données dans ASP.NET, donc je m'attendrais à ce que cela fonctionne. Voici le code:

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” 
     } 
    } 
} 

Et Data.xml est:

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

Quand j'appelle GetPropertyValue, je reçois cette exception:

DataBinding: 'System.Xml.XmlElement' ne contient pas une propriété avec le nom "Number".

Dans ma boucle de liaison de données, je veux juste faire une boucle sur tout IEnumerable - je ne veux pas de cas particulier le type XmlNode. Des contrôles tels que DropdownList auront un cas particulier IListSource et effectueront certaines conversions, cependant d'autres IEnumerables sembleront être traités tels quels. Merci!

Répondre

0

D'abord, j'utiliserais var et ne ferais rien d'autre que de lancer chaque nœud sur un objet. Ensuite, il faudrait que je vérifie mais je ne pense pas que vous allez avoir une propriété appelée numéro. Vous pourriez avoir un attributs d'appel de la propriété qui est un dictionnaire qui vous alors pouvez appeler:

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

Si tout ce que vous êtes désireux de faire est d'obtenir la valeur de cet attribut sur le nœud puis utilisez ceci:

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

System.Web.UI.DataBinder est généralement utilisé dans la partie html d'une page asp.net. Je ne l'ai jamais utilisé à l'intérieur d'un static void Main().

Edit:

J'ai trouvé un lien après googler: "databound dropdownlist xml" que je pense pourrait aider.

ASP Net - databinding xml to dropdownlist

+0

Si vous faites cela, vous avez un boîtier spécial XmlNode. Je veux être capable de transmettre un IEnumerable de DataRows, un HashTable, etc. Fondamentalement tout ce que vous pourriez typiquement lier à une source de données dans ASP.NET. – Mike

+0

Fait quelques changements ... – bytebender

+0

Comme je l'ai dit, je ne veux pas supposer que IEnumerable est un XmlNode. Je veux que ça marche avec n'importe quoi .. Merci quand même. – Mike

0

Je suivis cette baisse et il est exact, XmlDocument n'est pas bindable parce XmlNode ne met pas en oeuvre un descripteur de propriété. Selon mes sources, il a été question de le faire pendant plusieurs années mais cela ne s'est pas encore produit. Toutefois, la classe XmlDataSource fournit réellement cette fonctionnalité. L'astuce consiste à créer une XmlDataSource à partir de votre XmlDocument et de lier à celle-ci à la place, ce qui fonctionnera parfaitement.

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();