Hi, I am trying to create a list of a generic / dynamic class using XElement and DynamicLinq to then show in the file dataGridView1.DataSource
First you can do xml using the XElement class.
List<string> elements = new List<string>();
elements.Add("Name");
elements.Add("Address");
elements.Add("OtherElements1");
elements.Add("OtherElements2");
elements.Add("OtherElements3");
XElement XElement_Root = new XElement("Root");
XElement XElement_Item = new XElement("Item");
foreach (String element in elements)
{
XElement_Item.Add(new XElement(element));
}
for (int cc = 0; cc < 5; cc++ )
{
foreach (String elementName in elements)
{
XElement_Item.Element(elementName).Value = RandomString(10);
}
XElement_Root.Add(new XElement(XElement_Item));
}
String xml = XElement_Root.ToString();
It should look something like this.
- Root -
- Item -
- Name - KJHLRGOUDM - /Name -
- Address - QEOARCIIHO - /Address -
- OtherElements1 - LYHNXEPZCU - /OtherElements1 -
- OtherElements2 - MNSHTNYVXY - /OtherElements2 -
- OtherElements3 - DETZKZPJCE - /OtherElements3 -
- /Item -
- Item -
- Name - HYCNPMBTON - /Name -
- Address - QOSIADMHGE - /Address -
- OtherElements1 - ENLIKGEICX - /OtherElements1 -
- OtherElements2 - OGXYNOKFRH - /OtherElements2 -
- OtherElements3 - LEGJIPMKZH - /OtherElements3 -
- /Item -
...
- /Root -
This is all good. but now I get to my problem I want to turn this xml into a list of Item classes to add dataGridView1.DataSource to my file;
This works, but is not general / dynamic.
var listOfClassItem =
from classItem in XElement_Root.Descendants("Item")
select new
{
Name = classItem.Element("Name").Value,
Address = classItem.Element("Address").Value + " " +
classItem.Element("OtherElements1").Value,
PropertyZ = classItem.Element("OtherElements3").Value
};
dataGridView1.DataSource = listOfClassItem.ToList();
The grid then looks like this. Sorry, no image, work blocks: (
=============================================================
| Name | Address | PropertyZ |
=============================================================
| SCTGCITLTN | NKMGDIYTGP LUCGNJCUNQ | DYJJJGPZDH |
| KBMZTYAMTS | FZXDYVFAJO KVIMMNKSWG | OLKTODAGLO |
| APQPXOSANG | NHQMYCIRWL QBHKZYKPXI | UERMLHVXVL |
| UIJZXZIFPY | DDCESJZHHT PHHERLJUZS | WHMKNQCMUB |
| INPBWNBEIM | QNGXVQKQRO NRXBXIUWRB | DQAYPIBOPX |
=============================================================
OK, so it's good, but not general / dynamic, that I was trying to do it then.
String selectQuery = GetSelectedFields();
selectQuery = " new ( Element(\"Name\").Value as Name, " +
" Element(\"Address\").Value + \" \" + Element(\"OtherElements1\").Value as Address, " +
" Element(\"OtherElements3\").Value as PropertyZ )";
var listOfClassItem2 = XElement_Root.Descendants("Item").AsQueryable().Select(selectQuery);
List<object> ListOfItem = new List<object>();
foreach (var varItem in listOfClassItem2)
{
ListOfItem.Add(varItem);
}
dataGridView1.DataSource = ListOfItem;
The following error message appears.
No applicable method 'Element' exists in type 'XElement'
Can someone please help me using
XElement_Root.Descendants("Item").AsQueryable().Select(selectQuery);
, Normal Linq.
.