2017-07-12 11 views
0

XMLファイルの内容をIEn​​umerableコレクション(配列)に読み込み、別のページに各繰り返し(XMLデータのようなブロック)を出力する必要があります。IEnumerableコレクションの重複印刷

私はPrint()関数とe.HasMorePagesを使用しています。私の問題は、foreachは各印刷のIEnumerableコレクションのすべての反復をループするので、正しいページ数を印刷していますが、各ページにはページごとに1つではなくすべての繰り返しが含まれています。誰でも私にこのプロセスを管理するためのソリューションまたはより良い方法のアイデアを教えてもらえますか?

はここで...便利ジョエル、おかげだ

// 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); 
     } 

コードの該当部分です。

GEmployeeXGDは、1つのメソッドでクラスを継承します。このメソッドは、必要なXMLデータを読み込み、IEnumerable <コレクションを配列として取り込みます。ここでは、このような何か、あなたがオンになっているどのページを追跡し、する必要がある方法..

 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; 
    } 

答えて

0

です:あなたが呼び出しを避けることができれば

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

さらに良いことには、同じ方法を超えると同じIEnumerableを個々のページにわたって保持します。しかし、これを実証するために、私はこのメソッドが存在するクラスの文脈の詳細を見て、GEmployeeXGDの仕組みについてもっと知る必要があります。

+0

GEmployeeXGD.GetEmployeeGeneralData()ではスキップは使用できません。指定された通りに(var items = GEmployeeXGD.GetEmployeeGeneralData();)割り当てると、アイテムにはコレクションのすべての配列要素(employeeInfo [0]、employeeInfo [1]など)が含まれます。 foreachが一度に1つだけを使用するようにこれらの要素をインデックスする方法はありますか? – David

関連する問題