2012-10-26 14 views
2

我想生成一個樞軸的DataGridView的WinForms和的EntityFramework,從論文的實體開始:如何產生透視的DataGridView的WinForms和的EntityFramework

public class Return 
{ 
    public Return() 
    { 
     this.ReturnQty = new List<ReturnQty>(); 
    } 

    public int Id { get; set; } 
    public Nullable<System.DateTime> Date { get; set; } 
    public Nullable<int> ReturnReason { get; set; } 
    public Nullable<System.DateTime> Belastungsdatum { get; set; } 
    public virtual ICollection<ReturnQty> ReturnQty { get; set; } 
} 

public class ReturnQty 
{ 
    public int ID { get; set; } 
    public int Return_ID { get; set; } 
    public string ItemNo { get; set; } 
    public Nullable<decimal> Qty { get; set; } 
    public virtual Return Return { get; set; } 
} 

的樞軸Dataviewgrid應該是這樣的:

enter image description here

這是我現在有:

public static class ReturnReasons 
{ 

    public static string a { get { return "Grund nicht erfasst"; } } 
    public static string a1 { get { return "Artikel mangelhaft"; } } 
    public static string a2 { get { return "Bestellirrtum Kunde"; } } 
    public static string a3 { get { return "Doppelbestellung Kunde"; } } 
    public static string a4 { get { return "AV Kunde"; } } 
    public static string a5 { get { return "Kundenadresse falsch"; } } 
    public static string a6 { get { return "Kunde nicht erreichbar"; } } 
    public static string a7 { get { return "Kundenstorno"; } } 
    public static string a8 { get { return "Nichtgefallen"; } } 
    public static string a9 { get { return "Transportschaden UPS/DHL/GLS"; } } 
    public static string a10 { get { return "Transportschaden Spedition"; } } 
    public static string a11 { get { return "Transportschaden verdeckt"; } } 
    public static string a12 { get { return "Kommissionierungsfehler"; } } 
    public static string a13 { get { return "Fehler Auftragserfasung"; } } 
    public static string a14 { get { return "Lieferverzögerung"; } } 
    public static string a15 { get { return "Warenrücksendung lt. Vereinbarung"; } } 
    public static string a16 { get { return "ohne Grund/sonstiges"; } } 
} 

     public class RetourenPivot 
    { 
     public string Item{ get; set; } 
     public IEnumerable<int?> ReturnReason{ get; set; } 
     public IEnumerable<decimal?> Qty{ get; set; } 
    } 

     private void DG_databind() 
    { 
     var query = _data.RepositoryRetouren.GetAll<ReturnQty>(); 
     // A Linq to EF which creates a List of concreate class called RetourenPivot. 
     var queryResults = (from iso in query 
          orderby iso.ItemNo ascending 
          group iso by iso.ItemNo into isoGroup 
          select new RetourenPivot() 
          { 
           Item = isoGroup.Key, 
           ReturnReason = isoGroup.Select(y => y.Return.ReturnReason), 
           Qty = isoGroup.Select(v => v.Qty) 
          }).ToList(); 


     // Call a function to create a dynamically created data table with the needed columns 

     // Create a DataTable as a DataSource for the grid 
     DataTable dt = new DataTable(); 
     // Create the DataColumns for the data table 
     DataColumn dc = new DataColumn("Artikel", typeof(string)); 
     dt.Columns.Add(dc); 

     // Get a list of Distinct Reasons 
     var ReasonLabel = (from yList in queryResults.Select(Reason => Reason.ReturnReason) 
          from Reason in yList 
          select Reason.ToString()).Distinct().ToList(); 

     // Create the DataColumns for the table 
     ReasonLabel.ForEach(delegate(string Reason) 
     { 
      var reasonTexts = typeof(ReturnReasons).GetProperties().Where(p => p.Name == "a" + Reason).ToList()[0].GetValue(null, null).ToString(); 
      dc = new DataColumn(reasonTexts, typeof(string)); 
      dt.Columns.Add(dc); 
     }); 

     // Populate the rowa of the DataTable 
     foreach (RetourenPivot rec in queryResults) 
     { 
      // The first two columns of the row always has a ISO Code and Description 
      DataRow dr = dt.NewRow(); 
      dr[0] = rec.Item; 

      // For each record 
      var Reason = rec.ReturnReason.ToList(); 
      var Qty = rec.Qty.ToList(); 

      // Because each row may have different reasons I am indexing 
      // the with the string name 
      for (int i = 0; i < Qty.Count; i++) 
      { 
       var reasonTexts = typeof(ReturnReasons).GetProperties().Where(p => p.Name == "a" + Reason[i].ToString()).ToList()[0].GetValue(null, null).ToString(); 
       dr[reasonTexts] = Qty[i].Value; 
      } 

      // Add the DataRow to the DataTable 
      dt.Rows.Add(dr); 
     } 

     // Bind the DataTable to the DataGridView 
     dataGridViewSummary1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing; 
     dataGridViewSummary1.ColumnHeadersHeight = 200; 

     //Connect Grid with DataSource 
     //this.dataGridViewSummary1.AutoGenerateColumns = true; 
     this.dataGridViewSummary1.DataSource = dt; 
    } 

問題是,queryResults中的每個RetourenPivot可能有多個具有相同ReturnReason的數量,我不知道如何總結它們。 例如現在看起來

項目123 ReturnReason {0,0,0,0,1,16} 數量{1,1,2,1,5,1}

什麼意味着,對於原因0有4個數量。它應該看起來像

項目123 ReturnReason {0,1,16} 數量{5,5,1}

回答

1

我在此回答我自己的問題。我不知道這個解決方案是否是最好的解決方案。

我創建了兩個臨時類查詢

public class RetourenNeu 
    { 
     public string Artikel { get; set; } 
     public int? Retourengrund { get; set; } 
     public decimal? Anzahl { get; set; } 
    } 

    public class RetourenPivot 
    { 
     public string Artikel { get; set; } 
     public IEnumerable<int?> Retourengrund { get; set; } 
     public IEnumerable<decimal?> Anzahl { get; set; } 
    } 

而且比我做兩個查詢。第一個查詢按ReturnReason和Itemnumber進行分組,並總結數量。第二個查詢按Itemnumber對第一個查詢進行分組。

 var queryResults = from iso in query 
          orderby iso.Artikelnummer ascending 
          group iso by new { iso.Artikelnummer, iso.Retourenkopfdaten.Retourengrund } into isoGroup 
          select new RetourenNeu() 
          { 
           Artikel = isoGroup.Key.Artikelnummer, 
           Retourengrund = isoGroup.Key.Retourengrund.HasValue ? isoGroup.Key.Retourengrund.Value : 0, 
           Anzahl = isoGroup.Select(v => v.Anzahl).Sum() 
          }; 

      var neu = (from n in queryResults 
        group n by n.Artikel into source 
        select new RetourenPivot() 
        { 
         Artikel = source.Key, 
         Retourengrund = source.Select(s => s.Retourengrund), 
         Anzahl = source.Select(s => s.Anzahl) 
        }).ToList(); 

現在結果是根據需要。

1

這不是一個配方而只是提出了一些建議,以解決您的問題。

1)ReturnReason應該是一個類:

public class ReturnReason 
{ 
    public int Code { get; set; } 
    public string Description {get; set;} 
} 

2)創建ReturnReasonList類。實現它作爲一個獨立的,並用它來提供理由:

public sealed class ReturnReasonList 
{ 
    protected List<ReturnReason> pInstance = new List<ReturnReason> { 
     { .Code=1, .Description="whatever reason 1" }, 
     { .Code=2, .Description="whatever reason 2" }, 
     ... 
     { .Code=n, .Description="whatever reason n" }}; 


    private ReturnReasonList() {} 

    public List<Returnreason> pInstance 
    { 
     get 
     { 
     return pInstance; 
     } 
    } 
} 

3)考慮究竟需要爲每對(貨號,ReturnReason):

public class ReturnedQuantity 
{ 
    int ItemNumber { get; set; } 
    Returnreason { get; set;} 
    int Quantity {get; set;} 
} 

4)現在,你必須創建一個從返回的數據列表:

var query = _data.RepositoryRetouren.GetAll<ReturnQty>(); 
List<ReturnedQuantity> returns = from r in query 
           join rs in ReturnReasonList.Instance 
           on r.ReturnReason = rs.Code 
           group by rs, r.ItemNo 
           select new ReturnedQuantity() {.ItemNo = r.ItemNo, .Reason= rs, .Quantity = SUM(r.Qty) }; 

5)在ReturnReasonList.Items項目填寫您的DataGridView列集合

6)用您的文章列表中的項填充您的DataGridView行集合。

7)用數量填充DataGridView單元格。

相關問題