0

我知道必须有一种更清洁、更简洁的方法来做到这一点......但我没有任何地方试图谷歌搜索它。基本上,我有一组数据需要写入 HTML 表。

表格看起来像这样(但更长):

            DOB SDLW SDLY WTD LWTD
开始日期: 03/06/2013 02/27/2013 03/07/2012 03/04/2013 02/25/2013
结束日期:2013 年 3 月 6 日 2013 年 2 月 27 日
净销售额 5,661.47 4,876.82 16.1% 5,765.33 -1.8% 13,941.10 13,310.09 4.7%
总销售额 6,499.14 5,549.94 17.1% 6,602.71 -1.6% 16,046.50 15,306.56 4.8%
客人数量 369.00 317.00 16.4% 392.00 -5.9% 920.00 872.00 5.5%
总收入 187.29 102.46 82.8% 163.19 4.8% 499.74 455.82 9.6%
总无效 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) + "&nbsp;" + "</td>";
    }

我仍然不是特别喜欢,但我至少在我开始的地方有了显着改善。然而...

大局问题:

是我通过连接使用 += 语句(畏缩)构建的值字符串来构建这些行,如下所示:

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

(在写这篇文章时,我意识到我可能会使用一些 .NET 3.5 魔法将我的内部 foreach 和嵌套在其中的 if 语句结合起来;我仍在学习,并且也希望得到这方面的指导)

这些 Col 数组用于百分比差异。

在所有循环结束时,我得到了五个包含完整行的数组,来自<tr>...</tr>(每行 19 个数据单元),然后我再次循环返回 foreach 站点(因为信息是按位置存储的,所以 Store1 的数据位于在 finalNet[0]、finalGross[0] 等)并将它们写入HtmlTextWriter.

我的部分问题是我的实际数据是垂直存储的(使用包含一个日期的完整列的对象 - 这些值是根据列标题中的日期从 SQL 查询中提取的) - 而它必须水平输出桌子。

但是,我在弄清楚如何清理此代码并保持表格格式不变时遇到了问题。任何想法将不胜感激。

4

2 回答 2

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

剃刀模板示例:

<table>
    @foreach(var row in Model) {
        <tr>
            @foreach(var col in row) {
                <td>@col</td>
            }
        </tr>
    }
</table>

在不了解更多代码的情况下,给你一个更好的例子有点困难,但我认为这应该引导你朝着正确的方向前进

于 2013-03-08T06:27:01.777 回答
0

我完全同意“红狗”。您应该使用 gridview 控件并将您的 Data 对象作为数据源传递给 gridview。您还可以将 JQGrid 用于客户端脚本。

于 2013-03-08T05:21:32.513 回答