2015-05-24 2 views
0

Я пытаюсь экспортировать свои данные, чтобы преуспеть файл, и я строительный объект и передать его на экспорт, я хочу, чтобы проверить, прежде чем строить полный объект, но он неэкспорта KeyValuePair преуспеть

public ActionResult ExportToExcel(int roleId, int? levelId) 
     { 
      var moduleItems = db.C_UserItems 
       .Include(x => x.S_Registration) 
       .Where(x => x.RoleId == roleId); 

      if (levelId != null) 
       moduleItems = moduleItems.Where(x => x.S_Registration.LevelId == levelId); 

      List<object> objList = new List<object>(); 
      int i = 0; 
      foreach (var item in moduleItems) 
      { 
       i++; 

       List<KeyValuePair<string, object>> obj = new List<KeyValuePair<string, object>>(); 
       obj.Add(new KeyValuePair<string, object>("Num", i)); 
       obj.Add(new KeyValuePair<string, object>("Name", item.Name)); 
       obj.Add(new KeyValuePair<string, object>("Email", item.Email)); 

       if (roleId == 5) 
       { 
        obj.Add(new KeyValuePair<string, object>("Phone", item.Phone)); 
        obj.Add(new KeyValuePair<string, object>("CellPhone", item.CellPhone)); 
       } 

       objList.Add(obj); 
      } 

      SaveToExcel(objList); 

      return RedirectToAction("Index", new { id = roleId, levelId = levelId }); 
     } 

и это мой метод экспорта

protected void SaveToExcel(List<object> objList) 
      { 
       //Save result as excel file 
       HttpResponse response = System.Web.HttpContext.Current.Response; 
       // first let's clean up the response.object 
       response.Clear(); 
       // set the response mime type for excel 
       response.ContentType = "application/vnd.ms-excel"; 
       response.AddHeader("Content-Disposition", "attachment;filename=\"Alaglan.xls\""); 
       response.ContentEncoding = System.Text.Encoding.Unicode; 
       response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble()); 

       using (StringWriter sw = new StringWriter()) 
       { 
        using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
        { 
         // instantiate a datagrid 
         GridView dg = new GridView(); 

         dg.DataSource = objList; 
         dg.DataBind(); 
         dg.RenderControl(htw); 
         response.Write(sw.ToString()); 
         response.End(); 
        } 
       } 
      } 

результат выглядит как кол, емкости для каждой строки, я попробовал другой путь, прежде чем построить этот объект, и он работает хорошо, но его так трудно для построения больших данных,

if (roleId == 4) 
       { 
        objList.Add(new 
        { 
         m = i, 
         name = item.Name, 
         email = item.Email 
        }); 
       } 
       else 
       { 
        objList.Add(new 
        { 
         m = i, 
         name = item.Name, 
         email = item.Email, 
         identity = item.S_Registration.Identification 
        }); 
       } 

кто может помочь мне, пожалуйста, за лучший способ построить объект с некоторой проверки

ответ

1

Первая вещь, это кажется мне неправильным:

obj.Add(new KeyValuePair<string, object>("Name", item.Phone)); 
obj.Add(new KeyValuePair<string, object>("Email", item.CellPhone)); 

должен быть Phone и CellPhone вместо Name и Email:

obj.Add(new KeyValuePair<string, object>("Phone", item.Phone)); 
obj.Add(new KeyValuePair<string, object>("CellPhone", item.CellPhone)); 

Во-вторых, я думаю, вы не можете создать GridView с вашей структуры tha t использует KeyValuePair из коробки.

Однако я бы переписал код для использования DataTable вместо анонимных объектов и пар ключ/значение и связал это DataTable с GridView. Он предлагает большую гибкость, чем анонимные объекты, и не имеет проблем со связыванием, которое имеет KeyValuePair.

Например:

// Create data table to be filled 
var DT = new DataTable(); 
DT.Columns.Add("Num", typeof(int)); 
DT.Columns.Add("Name"); 
DT.Columns.Add("Phone"); 
DT.Columns.Add("CellPhone"); 

... 

int i = 0; 
foreach (var item in moduleItems) 
{ 
    i++; 

    DataRow Row = DT.NewRow(); 
    Row["Num"] = i; 
    Row["Name"] = item.Name; 
    Row["Email"] = item.Email; 

    if (roleId == 5) 
    { 
     Row["Phone"] = item.Phone; 
     Row["CellPhone"] = item.CellPhone; 
    } 

    DT.Rows.Add(Row); 
} 

... 

// instantiate a datagrid 
GridView dg = new GridView(); 

dg.DataSource = DT.DefaultView; 
dg.DataBind(); 
dg.RenderControl(htw); 
response.Write(sw.ToString()); 
response.End(); 
+0

У меня есть более чем 150 колонок для экспорта в каждой строке, и некоторые из этих колонн я должен проверить, прежде чем сделать его, поэтому я искал решение поможет мне сделать это, последний код, который я добавил, работает отлично, но я не могу проверить свойства легко, я должен повторить целые столбцы, поэтому я попытался использовать keyvaluepairs, но он не работал правильно –

+0

Затем переключитесь на 'DataTable', как я сказал в обновленном ответе. См. «DataTable» также обеспечивает легкий доступ к строкам/значениям (в отличие от анонимных объектов). – Dusan

+0

Мне очень жаль, но вы можете объяснить свой ответ небольшим количеством кода, чтобы понять это, заранее спасибо –

Смежные вопросы