こんにちは、XElementとDynamicLinqを使用して汎用/動的クラスのリストを作成して、dataGridView1.DataSourceに表示しようとしていますC#ランタイムでXElementを使用してダイナミックLinqでカスタム(ダイナミック)クラスを作成する方法
まず、XElementクラスを使用してxmlを作成します。
// a List of String that are going to be our dynamic class's properties.
List<string> elements = new List<string>();
elements.Add("Name");
elements.Add("Address");
elements.Add("OtherElements1");
elements.Add("OtherElements2");
elements.Add("OtherElements3");
// XML Root Element
XElement XElement_Root = new XElement("Root");
// Item Element, This is our dynamic class
XElement XElement_Item = new XElement("Item");
// Insert the elements as XElements in the Item XElement
// This is like defining our Properties to our Item Class
foreach (String element in elements)
{
XElement_Item.Add(new XElement(element));
}
// Add 5 "Item" classes to the List "Root"
for (int cc = 0; cc < 5; cc++)
{
foreach (String elementName in elements)
{
// Adding a Random 10 length string to each "Item" Element(property)
XElement_Item.Element(elementName).Value = RandomString(10);
}
// Adding the populated "Class"(Item) to the "List<>"(Root)
XElement_Root.Add(new XElement(XElement_Item));
}
// Preview of the created xml.
String xml = XElement_Root.ToString();
これは次のようになります。
- 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 -
これはすべて良好です。しかし今私は私の問題になる 私は、このXMLをクラス "Item"のリストに入れて、dataGridView1.DataSourceに追加したい。
これは機能しますが、汎用/動的ではありません。
// Normal Linq !!! NOT GENERIC/DYNAMIC !!!
var listOfClassItem =
from classItem in XElement_Root.Descendants("Item") // "Item" is our class Name
select new
{
Name = classItem.Element("Name").Value,
Address = classItem.Element("Address").Value + " " +
classItem.Element("OtherElements1").Value,
PropertyZ = classItem.Element("OtherElements3").Value
};
// populate the dataGridView1.DataSource with the New List of Class Item
dataGridView1.DataSource = listOfClassItem.ToList();
グリッドは次のようになります。申し訳ありませんが何の画像、作業ブロックeveryting :(
=============================================================
| Name | Address | PropertyZ |
=============================================================
| SCTGCITLTN | NKMGDIYTGP LUCGNJCUNQ | DYJJJGPZDH |
| KBMZTYAMTS | FZXDYVFAJO KVIMMNKSWG | OLKTODAGLO |
| APQPXOSANG | NHQMYCIRWL QBHKZYKPXI | UERMLHVXVL |
| UIJZXZIFPY | DDCESJZHHT PHHERLJUZS | WHMKNQCMUB |
| INPBWNBEIM | QNGXVQKQRO NRXBXIUWRB | DQAYPIBOPX |
=============================================================
OKので、これは私がこのだっしようとしたものを、 いいがジェネリックではない/ダイナミックではありません。
// Dynamic Linq now this should be more GENERIC/DYNAMIC
// I want the User to be able to select which fields (properties) they want to show in the DataGrid
String selectQuery = GetSelectedFields(); // private String GetSelectedFields() { return ...}
// selectQuery will then be some thing like.
selectQuery = " new (Element(\"Name\").Value as Name, " +
" Element(\"Address\").Value + \" \" + Element(\"OtherElements1\").Value as Address, " +
" Element(\"OtherElements3\").Value as PropertyZ)";
// Then using Dynamic Linq to get the generic/dynamic class from the selection.
// !!! THIS IS WHERE I'M STUCK !!! this does not work. :(
var listOfClassItem2 = XElement_Root.Descendants("Item").AsQueryable().Select(selectQuery);
// I Found that this was the easiest way to get the "var" back to a List, to add to the .DataSource
// because the IQueryable above does not have a .ToList();
List<object> ListOfItem = new List<object>();
foreach (var varItem in listOfClassItem2)
{
ListOfItem.Add(varItem);
}
// populate the dataGridView1.DataSource with the New List of Class Dynamic Item
dataGridView1.DataSource = ListOfItem;
私は、次のエラーメッセージが表示されます。
No applicable method 'Element' exists in type 'XElement'
誰かが、私を助けてくださいすることができます
XElement_Root.Descendants("Item").AsQueryable().Select(selectQuery);
私はNormal Linqを使用したときと同じ結果を得ることができます。 Thx。