2017-05-10 3 views
0

これを考えすぎる可能性があります。私は、プリンシパルに学校の生徒のリストを選択させ、PDF文書に印刷させる。私はSQL DBから名前を取得し、HTMLTableにc#で記述し、このテーブルをPDFコンバータに渡します。以下のコードでは、名前を1つの列テーブルに書きますが、1,000を超える名前が存在する可能性があるため、30の名前ごとに停止して新しい列に名前を書き込むようにコードをスマートにしたい。これは、リストがページ全体でアルファベット順にできる場合は簡単ですが、ユーザーはアルファベット順の名前をページの下に表示したいと考えています。以下は私が今までに持っていたものです...必要ならこれをどうやって新しい柱を作ることができますか?c#名前リストをアルファベット順にエクスポートする方法ページあたり複数の列を使用する場合

HtmlGenericControl div = new HtmlGenericControl("div"); 
HtmlTable tbl = new HtmlTable(); 
div.Controls.Add(tbl); 
tbl.Width = "100%"; 

HtmlTableRow tr = new HtmlTableRow(); 
tbl.Rows.Add(tr); 

dl = sp.getDemographicLabels(pageID); 

HtmlTableCell tc = new HtmlTableCell(); 
tr.Cells.Add(tc); 
tc.InnerText = "Student Name"; 

tc = new HtmlTableCell(); 
tr.Cells.Add(tc); 
tc.InnerText = "Enrollment Date"; 

List<dynaTable> ldt = new List<dynaTable>(); 
ldt = sp.getActiveStudents_Unformatted(pageID); 
foreach (dynaTable dt in ldt) 
{ 
tr = new HtmlTableRow(); 
tbl.Rows.Add(tr); 

foreach (dynaTableColumn dtc in dt.dtc) 
{ 
    tc = new HtmlTableCell(); 
    tr.Cells.Add(tc); 
    tc.InnerText = dtc.colValue; 
} 
} 

export dmc = new export(); 

var sb = new StringBuilder(); 
div.RenderControl(new HtmlTextWriter(new StringWriter(sb))); 
string s = sb.ToString(); 

dmc.exportPDF("Student Profile", "Portrait", s); 

答えて

0

てみてください、私はこれが動作すると思います...しかし、私はそれを見たときにそれを知ってLINQの程度だけでは十分知っているが、それを使用しない方法を

class Program 
    { 

     static void Main(string[] args) 
     { 
      const int ROWS_PER_PAGE = 30; 
      const int COLUMNS_PER_PAGE = 3; 

      List<dynaTable> ldt = new List<dynaTable>(); 

      for(int i = 0; i < 84; i++) 
      { 
       ldt.Add(new dynaTable() { name = Encoding.UTF8.GetString(new byte[] {(byte)(i + 0x20)})}); 
      } 

      var results = ldt.OrderBy(x => x.name).Select((x, i) => new { person = x, index = i }) 
       .GroupBy(x => (int)(x.index/(ROWS_PER_PAGE * COLUMNS_PER_PAGE))) 
       .Select(x => x.GroupBy(y => y.index % ROWS_PER_PAGE).Select(z => new { 
        col1 = z == null ? string.Empty : z.FirstOrDefault() == null ? string.Empty : z.FirstOrDefault().person.name, 
        col2 = z == null ? string.Empty : z.Skip(1).FirstOrDefault() == null ? string.Empty : z.Skip(1).FirstOrDefault().person.name, 
        col3 = z == null ? string.Empty : z.Skip(2).FirstOrDefault() == null ? string.Empty : z.Skip(2).FirstOrDefault().person.name, 
       })) 
       .SelectMany(x => x).ToList(); 

     } 
    } 
    public class dynaTable 
    { 
     public string name { get; set; } 
    } 

} 
+0

以下。私はこのようにそれを反復しようとしています: foreach(var stud in results) { tr = new HtmlTableRow(); tbl.Rows.Add(tr); tc = new HtmlTableCell(); tr.Cells.Add(tc); tc.InnerText = stud.column1; tc = new HtmlTableCell(); tr.Cells.Add(tc); tc.InnerText = stud.column2; }ですが、linqの "new {col1 = z.First ..."部分を強調表示し、オブジェクトに設定されていないと言っていますか? –

+0

zの上でフーバーして、どのzが設定されているかを確認してください。最初の行またはリストの中央に設定されているかどうかを確認します。私はその問題がページあたり90個の項目を持たないので列が空であると思われます。 nullをテストするコードを変更しました – jdweng

+0

それはそれでした!今すぐ完璧に動作します - ありがとうございます!私は正しい軌道に乗っていた、私は同じことを考えていたとString.IsNullorEmpty()を使用してnullをチェックしようとしたが、私は間違って何かをしている必要があります。どちらにせよ、古いコーダーを助けてくれてありがとう! –

関連する問題