2017-08-17 61 views
0

我有学生商标表数据库以这种形式怎样水平的数据从数据库转换成垂直的datagridview在C#

enter image description here

---------------------------------- 
|R.N| Student Name|Subjects|Marks| 
---------------------------------- 
|1 |Indra Poudel |DBMS |75 | 
|1 |Indra Poudel |SAD  |75 | 
|1 |Indra Poudel |TOC  |75 | 
|2 |Jon snow  |DBMS |75 | 
|2 |Jon snow  |SAD  |75 | 
|2 |Jon snow  |TOC  |75 | 
---------------------------------- 

现在我要显示在DataGridView在以下这些数据形式

---------------------------------- 
|R.N| Student Name|DBMS|SAD |TOC| 
---------------------------------- 
|1 |Indra Poudel |75 |75 |75 | 
|2 |Jon snow  |75 |75 |75 | 
---------------------------------- 
+0

你有试过什么吗?如果您在数据库中查看数据透视表,如果您想要一个linq解决方案,您可以尝试按 –

+0

进行分组。为什么要改为图片?比以前更容易阅读 –

+0

在SQL中使用数据透视表 – Sparrow

回答

1

你需要一个数据透视表:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 


namespace ConsoleApplication73 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 

      dt.Columns.Add("R.N", typeof(int)); 
      dt.Columns.Add("Student Name", typeof(string)); 
      dt.Columns.Add("Subjects", typeof(string)); 
      dt.Columns.Add("Marks", typeof(int)); 

      dt.Rows.Add(new object[] { 1, "Indra Poudel", "DBMS", 75 }); 
      dt.Rows.Add(new object[] { 1, "Indra Poudel", "SAD", 75 }); 
      dt.Rows.Add(new object[] { 1, "Indra Poudel", "TOC", 75 }); 
      dt.Rows.Add(new object[] { 2, "John show", "DBMS", 75 }); 
      dt.Rows.Add(new object[] { 2, "John show", "SAD", 75 }); 
      dt.Rows.Add(new object[] { 2, "John show", "TOC", 75 }); 

      string[] subjects = dt.AsEnumerable().Select(x => x.Field<string>("Subjects")).Distinct().ToArray(); 

      DataTable pivot = new DataTable(); 
      pivot.Columns.Add("R.N", typeof(int)); 
      pivot.Columns.Add("Student Name", typeof(string)); 

      foreach (string subject in subjects) 
      { 
       pivot.Columns.Add(subject, typeof(int)); 
      } 

      var groups = dt.AsEnumerable().GroupBy(x => x.Field<int>("R.N")); 

      foreach (var group in groups) 
      { 
       DataRow newRow = pivot.Rows.Add(); 
       newRow["R.N"] = group.FirstOrDefault().Field<int>("R.N"); 
       newRow["Student Name"] = group.FirstOrDefault().Field<string>("Student Name"); 

       foreach (var col in group) 
       { 
        newRow[col.Field<string>("Subjects")] = col.Field<int>("Marks"); 
       } 

      } 


     } 
    } 


}