我知道必须有一个更清洁,更简洁的方法来做到这一点......但我没有在任何地方尝试使用谷歌。基本上,我有一组数据需要写入HTML表格。
表格看起来像这样(但更长):
DOB SDLW SDLY WTD LWTD Start Date: 03/06/2013 02/27/2013 03/07/2012 03/04/2013 02/25/2013 End Date: 03/06/2013 02/27/2013 Net Sales 5,661.47 4,876.82 16.1% 5,765.33 -1.8% 13,941.10 13,310.09 4.7% Gross Sales 6,499.14 5,549.94 17.1% 6,602.71 -1.6% 16,046.50 15,306.56 4.8% Guest Count 369.00 317.00 16.4% 392.00 -5.9% 920.00 872.00 5.5% Total Comps 187.29 102.46 82.8% 163.19 4.8% 499.74 455.82 9.6% Total Voids 56.25 51.05 10.2% 131.65 -57.3% 161.05 227.83 -29.3%
副行问题:
最初我使用HtmlTextWriter
编写了此内容,但必须为每个AddAttribute()
调用<td>
,这会产生大量(嘈杂)代码。然后我转到了包装器,所以我可以将一个单元格减少到一行代码:
public string wrapAmntCell(Object input)
{
return "<td align=\"right\">" + string.Format("{0:n}", input) + " " + "</td>";
}
我仍然特别喜欢,但我至少在我开始的地方有了显着改善。然而...
更大的问题:
我是通过连接用+ =语句(cringe)构建的值的字符串来构建这些行,如下所示:
string[] finalNet = new string[validSites.Count];
string[] finalGross = new string[validSites.Count];
string[] finalGC = new string[validSites.Count];
string[] finalComp = new string[validSites.Count];
string[] finalVoid = new string[validSites.Count];
foreach (string num in validSites)
{
//SDLY
foreach (DataStore sdlyTmp in sdly)
{
if (sdlyTmp.siteNumber.Equals(num))
{
finalNet[countTD] += wrapAmntCell(sdlyTmp.netSales);
finalGross[countTD] += wrapAmntCell(sdlyTmp.grossSales);
finalGC[countTD] += wrapAmntCell(sdlyTmp.guestCount);
finalComp[countTD] += wrapAmntCell(sdlyTmp.compTotal);
finalVoid[countTD] += wrapAmntCell(sdlyTmp.voidTotal);
tmpCol03[0] = sdlyTmp.netSales;
tmpCol03[1] = sdlyTmp.grossSales;
tmpCol03[2] = sdlyTmp.guestCount;
tmpCol03[3] = sdlyTmp.compTotal;
tmpCol03[4] = sdlyTmp.voidTotal;
//percentage diff
finalNet[countTD] += wrapPctCell(getPctDiff(tmpCol01[0], tmpCol03[0]));
finalGross[countTD] += wrapPctCell(getPctDiff(tmpCol01[1], tmpCol03[1]));
finalGC[countTD] += wrapPctCell(getPctDiff(tmpCol01[2], tmpCol03[2]));
finalComp[countTD] += wrapPctCell(getPctDiff(tmpCol01[3], tmpCol03[3]));
finalVoid[countTD] += wrapPctCell(getPctDiff(tmpCol01[4], tmpCol03[4]));
//end diffs
totalsCol03[0] += sdlyTmp.netSales;
totalsCol03[1] += sdlyTmp.grossSales;
totalsCol03[2] += sdlyTmp.guestCount;
totalsCol03[3] += sdlyTmp.compTotal;
totalsCol03[4] += sdlyTmp.voidTotal;
}
}
}
(以书面形式说,我意识到我可能会将我的内部foreach和嵌套在其中的if语句结合起来使用一些.NET 3.5魔法;我还在学习,并且也会对此有所了解)
这些Col数组用于百分比差异。
在我的所有循环结束时,我最终得到了五个包含完整行的数组,来自<tr>...</tr>
(每行数据19个单元格),然后我再次循环回到foreach网站(作为信息)存储位置,Store1的数据位于finalNet [0],finalGross [0]等,并将它们写入HtmlTextWriter
。
我的部分问题是我的实际数据是垂直存储的(使用包含一个日期的完整列的对象 - 这些值是根据列标题中的日期从SQL查询中提取的) - 而它必须是在表格中水平输出。
但是,我在弄清楚如何清理这些代码并保持我的表格格式完整时遇到了问题。任何想法都将不胜感激。
答案 0 :(得分:1)
我建议您使用Razor等视图引擎。该项目是开源的,在ASP.Net运行时之外工作。这样,您可以将演示文稿(HTML表格的生成)与数据生成分开。通过这种方式,您可以按照以下方式编写代码。假设您的SQL查询中的数据是以列为导向的(如您所建议的)并且是名为data
的集合
可执行文件中的C#代码:
var data = ...;
var template = File.ReadAllText("path/to/razor/template.cshtml");
var html = Razor.Parse(template,data); //Bind the SQL data to the HTML
Razor模板示例:
<table>
@foreach(var row in Model) {
<tr>
@foreach(var col in row) {
<td>@col</td>
}
</tr>
}
</table>
在不了解更多代码的情况下,给你一个更好的例子有点困难,但我认为这应该会引导你走向正确的方向
答案 1 :(得分:0)
我完全同意“Reddog”。 您应该使用gridview控件并将您的Data对象作为数据源传递给gridview。您也可以使用JQGrid进行客户端脚本编写。