3

我正在尝试实现一种方法,该方法将接受DataTableStringTemplate返回数据的字符串表示形式。

我在这里这里找到了如何做到这一点,但它对我不起作用。

示例代码:

// 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]

升级版:

我必须使用Antlr3.StringTemplate.dll版本3.1.0StringTemplate. 我决定尝试另一个版本并下载Antlr3.StringTemplate.dll版本3.3.0。一切正常。那么,有没有办法在DataTable使用旧库时应用模板?

4

2 回答 2

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库,适用于DataTable

var st = new StringTemplate("$items:{$it.StrCol$ $it.IntCol$\n}$");
st.SetAttribute("items", table.Rows);
于 2012-01-04T12:07:03.390 回答
0

要么塑造你的数据行:

select new { StrCol = dataRow["StrCol"], IntCol = dataRow["IntCol"] }

或调整您的 StringTemplate (虽然不确定这是否有效)

var st = new StringTemplate("$items:{$it[0]$ $it[1]}$");   
于 2012-01-03T14:36:12.367 回答