Выходные данные DataTable с использованием StringTemplate - PullRequest
3 голосов
/ 03 января 2012

Я пытаюсь реализовать метод, который будет принимать DataTable с StringTemplate и возвращать строковое представление данных.

Я нашел, как это сделать здесь и здесь , но у меня это не работает.

Пример кода:

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

Я должен использовать Antlr3.StringTemplate.dll версия 3.1.0 из StringTemplate.Я решил попробовать другую версию и скачал Antlr3.StringTemplate.dll версия 3.3.0 .Все отлично работаетИтак, есть ли способ применить шаблон на DataTable, используя старую библиотеку?

Ответы [ 2 ]

1 голос
/ 04 января 2012

Возможный обходной путь для использования строковых шаблонов в 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);
0 голосов
/ 03 января 2012

либо сформируйте свой datarow:

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

или измените свой StringTemplate (хотя не уверен, что это работает)

var st = new StringTemplate("$items:{$it[0]$ $it[1]}$");   
...