我正在尝试实现一个接受DataTable
StringTemplate
并返回数据字符串表示的方法。
我找到了如何执行此操作here和here,但这对我不起作用。
示例代码:
// Here can be any table with any number of columns.
var table = new DataTable();
table.Columns.Add("StrCol", typeof(string));
table.Columns.Add("IntCol", typeof(int));
table.Rows.Add(new object[] { "Row1String", 1 });
table.Rows.Add(new object[] { "Row2String", 2 });
var data = from dataRow in table.AsEnumerable()
select dataRow;
var st = new StringTemplate("$items:{$it.StrCol$ $it.IntCol$}$");
st.SetAttribute("items", data);
Console.Write(st.ToString());
结果:
Class DataRow has no such attribute: StrCol in template context [anonymous anonymous]
Class DataRow has no such attribute: IntCol in template context [anonymous anonymous]
Class DataRow has no such attribute: StrCol in template context [anonymous anonymous]
Class DataRow has no such attribute: IntCol in template context [anonymous anonymous]
UPD:
我必须使用StringTemplate
的 Antlr3.StringTemplate.dll 版本 3.1.0 。我决定尝试另一个版本并下载 Antlr3.StringTemplate.dll 版本 3.3.0 。一切正常。那么,有没有办法在DataTable
上使用旧库来应用模板?
答案 0 :(得分:1)
在DataTable
上使用字符串模板的可能解决方法是将行转换为字典集合,因此可以按列名访问行单元格:
var columns = table.Columns.Cast<DataColumn>().Select(col => col.ColumnName);
var data = from DataRow row in table.Rows
select columns.ToDictionary(col => col, col => row[col]);
var st = new StringTemplate("$items:{$it.StrCol$ $it.IntCol$\n}$");
st.SetAttribute("items", data);
适用于StringTemplate
的{{1}}库的较新版本:
DataTable
答案 1 :(得分:0)
要么塑造你的数据流:
select new { StrCol = dataRow["StrCol"], IntCol = dataRow["IntCol"] }
或调整你的StringTemplate(不确定是否有效)
var st = new StringTemplate("$items:{$it[0]$ $it[1]}$");