2017-07-09 3 views
0

Ich habe folgende Schleife in C#:Looping durch eine Klasse und Hinzufügen jeder Zeile eines Datentabelle fügt nur eine Zeile

 PayrollItem[] it = GetPayrollItems(xmlResult); 

     foreach (var inv in it) 
     { 
      DataRow row = ResultsTable.NewRow(); 
      row["EmployeeKey"] = inv.BadgeNo; 
      row["StoreKey"] = inv.CostCentre; 
      row["EmployeeName"] = inv.EmpName; 
      row["DateKey"] = inv.Date; 
      row["Incheck"] = inv.In; 
      row["Outcheck"] = inv.Out; 
      System.Diagnostics.Debug.WriteLine("inv.BadgeNo {0} i StoreKey {1}", inv.EmpName, inv.CostCentre); 
      ResultsTable.Rows.Add(row); 
      return ResultsTable; 
     } 

wo xmlResult eine XML-Datei mit Daten unter Verwendung eines SOAP-API-Aufruf gefüllt ist, und GetPayrollItems(); Schleifen im Wesentlichen durch die XMLfile und fügt Werte entsprechend:

public static PayrollItem[] GetPayrollItems(XmlDocument xmlDoc) 
    { 
     var items = new List<PayrollItem>(); 

     var node = xmlDoc.LastChild; //SOAP-ENV:Envelope 
     if (node != null) 
     { 
      node = node.FirstChild; //SOAP-ENV:Body 
      if (node != null) 
      { 
       node = node.FirstChild; //ns1:wsdlGetValuesResponse 
       if (node != null) 
       { 
        node = node.FirstChild; //return 

        if (node != null) 
        { 
         int count = node.ChildNodes.Count; 

         foreach (XmlNode nodeItem in node.ChildNodes) 
         { 
          PayrollItem item = new PayrollItem(); 

          item.EmpName = nodeItem["empName"].InnerText; 
          item.BadgeNo = nodeItem["badgeNo"].InnerText; 
          item.CostCentre = nodeItem["costCentre"].InnerText; 
          item.Date = nodeItem["date"].InnerText; 
          item.In = nodeItem["in"].InnerText; 
          item.Out = nodeItem["out"].InnerText; 
          items.Add(item); 
         } 
        } 
       } 
      } 
     } 

     return items.ToArray(); 
    } 

wo I PayrollItems wie definiert haben:

public class PayrollItem 
    { 
     public string EmpName { get; set; } 
     public string BadgeNo { get; set; } 
     public string Date { get; set; } 
     public string In { get; set; } 
     public string Out { get; set; } 
     public string CostCentre { get; set; } 
    } 

    public class PayrollList : List<PayrollItem> 
    { 
     public void Add(string empName, string badgeNo, string date, string @in, string @out, string costCentre) 
     { 
      var data = new PayrollItem 
       { 
        EmpName = empName, 
        BadgeNo = badgeNo, 
        Date = date, 
        In = @in, 
        Out = @out, 
        CostCentre = costCentre 
       }; 
      this.Add(data); 
     } 
    } 

Ich rufe die Funktion GetPayrollItems von der Funktion GetPayroll. Diese Funktion benötigt einige Parameter, von denen der API-Schlüssel eines bestimmten Geschäfts ist.

Ich habe festgestellt, dass GetPayrollItems() Funktion manchmal 20 Zeilen jeder Iteration, d. H. Für einen Speicher zurückgibt. Als ich jedoch die Tabelle ResultsTable inspiziere, als das Programm ausgeführt wurde, bemerkte ich, dass nur eine Zeile für jeden Speicher hinzugefügt wird. Ich habe bemerkt, dass es manchmal bis zu 20 Zeilen in einer Iteration

Wenn ich die Schleife getestet, die Reihen zu ResultsTable fügt hinzu, aber immer noch nur eine Zeile wird die ResultsTable hinzugefügt.

Hat jemand eine Idee, warum dies sein könnte?

+0

Sie kehren in die foreach-Schleife zurück. Also nur das erste Element im Array bekommen. – Scrobi

Antwort

1

Verschieben Sie die Rückgabe aus der Schleife.

PayrollItem[] it = GetPayrollItems(xmlResult); 

    foreach (var inv in it) 
    { 
     DataRow row = ResultsTable.NewRow(); 
     row["EmployeeKey"] = inv.BadgeNo; 
     row["StoreKey"] = inv.CostCentre; 
     row["EmployeeName"] = inv.EmpName; 
     row["DateKey"] = inv.Date; 
     row["Incheck"] = inv.In; 
     row["Outcheck"] = inv.Out; 
     System.Diagnostics.Debug.WriteLine("inv.BadgeNo {0} i StoreKey {1}", inv.EmpName, inv.CostCentre); 
     ResultsTable.Rows.Add(row); 

    } 

return ResultsTable; 
Verwandte Themen