2015-10-30 5 views
1

Я пытаюсь преобразовать таблицу данных в смарт-таблицу в C#. В основном хранимая процедура возвращает dataTable, и мне нужно перевести ее на объект JavaScript, но я не знаю, какие имена столбцов у меня будут. Смарт-таблица угловой рамки, которые требуется определенный формат, как показано ниже egample:Преобразование DataTable в динамический класс

$scope.columnCollection = ["firstName", "lastName", "birthDate", "balance", "email"]; 

$scope.rowCollection = [ 
    { firstName: 'Laurent', lastName: 'Renard', birthDate: new Date('1987-05-21'), balance: 102, email: '[email protected]' }, 
    { firstName: 'Blandine', lastName: 'Faivre', birthDate: new Date('1987-04-25'), balance: -2323.22, email: '[email protected]' }, 
    { firstName: 'Francoise', lastName: 'Frere', birthDate: new Date('1955-08-27'), balance: 42343, email: '[email protected]' } 
]; 

Так что я создал этот код, чтобы перевести его:

 public class SmartTable 
    { 
      public IList<string> ColumnCollection { get; set; } 
      public IList<Object> RowCollection { get; set; } 
    } 


     public SmartTable GetTableData(string sp, int widgetId = 0) 
    { 
     var connection = ConfigurationManager.ConnectionStrings["EFDbContext"].ConnectionString; 
     using (var da = new SqlDataAdapter("exec " + sp, connection)) 
     { 
      DataTable dt = new DataTable(); 

      da.Fill(dt); 
      da.FillSchema(dt, SchemaType.Mapped); 

      IList<string> colColls = new List<string>(); 

      foreach(DataColumn dc in dt.Columns) 
      { 
       colColls.Add(dc.Caption); 
      } 

      IList<Object> rowColls = new List<Object>(); 

      foreach (DataRow dr in dt.Rows) 
      { 
       dynamic rowColl = new Object(); 

       foreach (DataColumn dc in dt.Columns) 
       { 
        rowColl.Add(dc.Caption, dr[dc].ToString()); 
       } 
       rowColls.Add(rowColl); 

      } 

      SmartTable smartTable = new SmartTable 
      { 
       ColumnCollection = colColls, 
       RowCollection = rowColls 
      }; 

     return smartTable; 
     }; 
    } 

Но когда я запускаю это я получаю сообщение об ошибке «'объект "не содержит определения для„Add“» и ряд ниже подсвечивается:

rowColl.Add(dc.Caption, dr[dc].ToString()); 

Любая идея, как решить эту проблему?

EDIT

Если я ожидал бы, что статические данные все время, которое я хотел бы сделать это, как показано ниже:

public class Row 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public string birthDate { get; set; } 
    ... 
} 

, но проблема в том, что я не знаю, что и сколько столбцов У меня будет.

+0

Что вы ожидаете от этого? Возможно, вам нужен 'var rowColl = new List ();'. Но 'List.Add' не имеет перегрузки, которая принимает два параметра. Поэтому я не уверен, чего вы хотите. –

+0

Вопрос отредактирован, чтобы объяснить, что я ожидаю. – Whistler

ответ

3

Ваш вопрос здесь:

foreach (DataRow dr in dt.Rows) 
    { 
     dynamic rowColl = new Object(); 

     foreach (DataColumn dc in dt.Columns) 
     { 
      rowColl.Add(dc.Caption, dr[dc].ToString()); 
     } 
     rowColls.Add(rowColl); 

    } 

Я не уверен, почему вы используете динамический - просто использовать словарь, например так:

var dictionary = new Dictionary<string, List<object>>(); 
    foreach (DataColumn dataColumn in dataTable.Columns) 
    { 
     var columnValueList = new List<object>(); 

     foreach (DataRow dataRow in dataTable.Rows) 
     { 
      columnValueList.Add(dataRow[dataColumn.ColumnName]); 
     } 

     dictionary.Add(dataColumn.ColumnName, columnValueList); 
    } 
+0

Это не совсем ответ, но вы дали мне идею, как решить это, поэтому я буду отмечать его как ответ. Если кто-то заинтересован в ответе, пожалуйста, посмотрите мой ответ ниже. – Whistler

0

@returnsvoid ответ не дайте правильную структуру данных, но это дало мне смысл как это сделать. Если кому-то интересен точный ответ:

foreach(DataColumn dc in dt.Columns) 
      { 
       colColl.Add(dc.Caption); 
      } 

      IList<Dictionary<string, string>> rowColl = new List<Dictionary<string, string>>(); 

      foreach (DataRow dr in dt.Rows) 
      { 
       Dictionary<string, string> row = new Dictionary<string, string>(); 

       foreach (DataColumn dc in dt.Columns) 
       { 
        row.Add(dc.ColumnName, dr[dc].ToString()); 
       } 
       rowColl.Add(row); 
      } 

      SmartTable smartTable = new SmartTable 
      { 
       ColumnCollection = colColl, 
       RowCollection = rowColl 
      };