C# c如何将名称列表按字母顺序导出为PDF格式,每页包含多个列

C# c如何将名称列表按字母顺序导出为PDF格式,每页包含多个列,c#,tsql,pdf,C#,Tsql,Pdf,我可能想得太多了。我让校长从他们的学校选择一份学生名单并打印成PDF文档。我从SQL数据库中检索名称并将其写入c中的HTMLTable,然后将此表传递到PDF转换器中。下面的代码将名称写入一个单列表,但可能有1000多个名称,因此我希望代码足够智能,能够在每30个名称之后停止,并开始将名称写入一个新列,每页最多3列。如果列表可以按字母顺序在整个页面上显示,那么这就很容易了,但是我的用户希望名称按字母顺序在页面上显示。下面是我到目前为止所拥有的…如果需要的话,我怎样才能接受这些并创建新的专栏呢 H

我可能想得太多了。我让校长从他们的学校选择一份学生名单并打印成PDF文档。我从SQL数据库中检索名称并将其写入c中的HTMLTable,然后将此表传递到PDF转换器中。下面的代码将名称写入一个单列表,但可能有1000多个名称,因此我希望代码足够智能,能够在每30个名称之后停止,并开始将名称写入一个新列,每页最多3列。如果列表可以按字母顺序在整个页面上显示,那么这就很容易了,但是我的用户希望名称按字母顺序在页面上显示。下面是我到目前为止所拥有的…如果需要的话,我怎样才能接受这些并创建新的专栏呢

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);
试着跟随

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

}

我想这会有用的…但我对Linq的了解足够多,当我看到它时就知道了,但不知道如何使用它。我试图这样迭代:foreach var stud in results{tr=new HtmlTableRow;tbl.Rows.Addtr;tc=new HtmlTableCell;tr.Cells.Addtc;tc.InnerText=stud.column1;tc=new HtmlTableCell;tr.Cells.Addtc;tc.InnerText=stud.column2;}但它突出显示了新的{col1=z.First…linq的一部分,并表示未设置为对象?尝试在z上搜索,看看z设置为什么。检查它是否设置为您的第一行或列表的中间。我怀疑问题是当您每页没有90个项目,因此列为空时。我修改了代码以测试是否为空。原来是这样!!现在工作很完美-谢谢非常感谢!!我在正确的轨道上,我也在想同样的事情,并尝试使用String.IsNullorEmpty检查空值,但我一定是做错了什么。不管怎样,再次感谢您帮助一个老家伙解决问题!!我做了更多的测试,发现您不能使用Last,而必须使用skip2。使用Last会产生重复。请参阅更新d代码。