2013-03-08 21 views
0

我知道必須有一個更清潔,更簡潔的方式來做到這一點......但我不成氣候嘗試谷歌它。基本上,我有一組數據需要寫入HTML表格。1.4.3值的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) + "&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; 
     } 
    } 
} 

(以書面,我知道我大概可以結合我內心的foreach和如果嵌套在其聲明中使用一些.NET 3.5的魔法,我還在學習,並會在該感激指導和)

那些Col數組用於百分比差異。

在我的所有循環結束時,我最終得到了包含全行的五個數組,每行有<tr>...</tr>(每行19個數據單元格),然後我再次循環回到foreach站點(因爲信息存儲在位置上,Store1的數據位於finalNet [0],finalGross [0]等),並將它們寫入HtmlTextWriter。我的問題

部分原因是,我的實際數據是垂直存儲(使用一個包含一個日期一整列的對象 - 這些值是基於在列標題的日期SQL查詢拉) - 而它具有在表格中水平輸出。

不過,我在搞清楚如何收拾這個代碼,並把我的表的格式完整的問題。任何想法將不勝感激。

+0

如果你是使用ASP.NET Web窗體,我會建議使用綁定的[GridView](http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/gridview.aspx)或Repeater來調查數據綁定輸出的表格數據。 – Reddog 2013-03-08 04:19:45

+0

我不在ASP環境中,這是在我的SQL服務器上運行的可執行文件,轉儲HTML頁面,然後通過電子郵件發送出去。我會在DataGridView中找到相同的功能嗎? – raney 2013-03-08 05:28:46

+0

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 – 2013-03-08 06:39:37

回答

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> 

不知道更多的代碼,給你一個更好的例子有點困難,但我認爲這應該引導你在正確的方向

+0

我喜歡這個主意......謝謝!我無法贊成,但我標記爲答案。 – raney 2013-03-08 18:32:20

0

我完全與 「Reddog」 同意。 您應該使用gridview控件並將您的Data對象作爲數據源傳遞給gridview。您也可以使用JQGrid進行客戶端腳本編寫。