2017-07-12 1 views
0

Je suis en train de lire le contenu d'un fichier XML dans une collection IEnumerable (tableau) et j'ai besoin d'imprimer chaque itération (bloc de données XML similaires) sur une page séparée. J'utilise la fonction Print() et les pages e.HasMorePages. Mon problème est que le foreach boucle toutes les itérations de la collection IEnumerable pour chaque impression, donc j'imprime le nombre correct de pages, mais chaque page contient toutes les itérations les unes sur les autres au lieu d'une par page. Quelqu'un peut-il me donner une idée d'une solution ou d'une meilleure façon de gérer ce processus?Impression en superposition d'une collection IEnumerable

est ici la partie pertinente du code ...

// Print Employee General info 
     foreach (EmployeeInfo itm in GEmployeeXGD.GetEmployeeGeneralData()) 
     { 
      try 
      { 
       empFirstName = itm.FirstName; 
       empLastName = itm.LastName; 
       empMidInitial = itm.MidInitial; 
     etc… 

       // Set field coordinates for each employee 
       // ******* Employee's general information ******** 
       PointF empFirstNameLoc = new PointF(430, 271); 
       PointF empLastNameLoc = new PointF(600, 271); 
       PointF empMidInitialLoc = new PointF(563, 271); 
     etc… 
       // Send field text data 
       using (Font courierFont = new Font("Courier", 10, FontStyle.Bold)) 
       { 
        e.Graphics.DrawString(empFirstName, courierFont, Brushes.Black, empFirstNameLoc); 
        e.Graphics.DrawString(empLastName, courierFont, Brushes.Black, empLastNameLoc); 
        e.Graphics.DrawString(empMidInitial, courierFont, Brushes.Black, empMidInitialLoc); 
     etc… 
       } 
      } 
      catch (Exception error) { MessageBox.Show(error.ToString()); } 
      e.HasMorePages = (records < Globals.totalRecordCount); 
     } 

C'est utile Joel, merci. GEmployeeXGD vénère une classe avec une seule méthode.

La méthode lit dans les données XML dont j'ai besoin et remplit la collection IEnumerable <> en tant que tableau. Voici la méthode ..

 public Array GetEmployeeGeneralData() 
    { 
     // XML source file 
     var xmlEmployeeFile = File.ReadAllText("Corrections.xml"); 
     XDocument employeeDoc = XDocument.Parse(xmlEmployeeFile); 
     XElement w2cEmployeeDat = employeeDoc.Element("CorrectedDAta"); 
     EmployeeInfo[] employeeGenInfo = null; 
     if (w2cEmployeeDat != null) 
     { 
      IEnumerable<XElement> employeeRecords = w2cEmployeeDat.Elements("Employee"); 
      try 
      { 
       employeeGenInfo = (from itm in employeeRecords 
            select new EmployeeInfo() 
            { 
             FirstName = (itm.Element("FirstName") != null) ? itm.Element("FirstName").Value : string.Empty, 
             LastName = (itm.Element("LastName") != null) ? itm.Element("LastName").Value : string.Empty, 
             MidInitial = (itm.Element("MidInitial") != null) ? itm.Element("MidInitial").Value : string.Empty, 
      etc… 
            }).ToArray<EmployeeInfo>(); 
      } 
      catch (Exception) { MessageBox.Show(error.ToString()); } 
     } 
     Globals.SetRecordCount(employeeGenInfo.Count<EmployeeInfo>()); 
     recordCount = Globals.totalRecordCount; 

     return employeeGenInfo; 
    } 

Répondre

0

Vous devez garder une trace de la page que vous êtes, et faire quelque chose comme ceci:

var items = GEmployeeXGD.GetEmployeeGeneralData().Skip((pageNumber-1) * numberItemsPerPage).Take(numberOfItemsPerPage); 
foreach (EmployeeInfo itm in items) 
{ 
    //... 
} 

Encore mieux si vous pouvez éviter d'appeler la même méthode sur et plus, et gardez le même IEnumerable à travers des pages individuelles. Mais pour le démontrer, j'ai besoin de voir plus du contexte de la classe où cette méthode vit, et en savoir plus sur la façon dont fonctionne GEmployeeXGD.

+0

La fonction Ignorer n'est pas disponible pour GEmployeeXGD.GetEmployeeGeneralData(). Si j'affecte comme indiqué (var items = GEmployeeXGD.GetEmployeeGeneralData();) alors items contient tous les éléments du tableau des collections (par exemple employeeInfo [0], employeeInfo [1], etc). Existe-t-il un moyen d'indexer ces éléments afin que le foreach n'en utilise qu'un seul à la fois? – David