2013-03-08 2 views
0

Я знаю, что для этого нужно быть более чистым, более сжатым способом ... но я никуда не пытаюсь найти Google. В принципе, у меня есть набор данных, которые мне нужно написать в таблицу HTML.Вывод значений в таблицу 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; 
     } 
    } 
} 

(в письменной форме, что я понимаю, что я мог бы, вероятно, объединить свой внутренний Еогеасп и если заявление вложенного в него, используя некоторые .NET 3.5 магию, я все еще учусь, и хотел бы указание на то, как хорошо)

Если эти массивы Col используются для процентных различий.

В конце всех моих циклов я заканчиваю пятью массивами, которые содержат полные строки, от <tr>...</tr> (19 ячеек данных на строку), после чего я снова перехожу назад через сайт foreach (так как информация хранится позиционно , Данные Store1 находятся в finalNet [0], finalGross [0] и т. Д.) И записывают их в HtmlTextWriter.

Часть моей проблемы заключается в том, что мои фактические данные хранятся вертикально (с использованием объекта, который содержит полный столбец для одной даты - эти значения вытягиваются из SQL-запросов на основе даты в заголовке столбца), тогда как он должен выводиться горизонтально в таблицу.

Однако у меня возникают проблемы с выяснением способа очистки этого кода и сохранения формата таблицы. Любые мысли были бы весьма признательны.

+0

Если вы работая с веб-формами ASP.NET, я бы предложил исследовать использование связанного [GridView] (http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/gridview.aspx) или повторителя, которые позволяют выводить данные на основе данных табличных данных. – Reddog

+0

Я не в среде ASP, это исполняемый файл, который запускается на моем SQL-сервере, выгружает HTML-страницу, а затем отправляет ее по электронной почте. Я найду ту же функциональность в DataGridView? – raney

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

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> 

Не зная больше вашего кода, немного сложно дать вам лучший пример, но я думаю, что это должно привести вас в правильном направлении.

+0

Мне нравится эта идея ... спасибо! Я не могу повышать, но я отметил как ответ. – raney

0

Я полностью согласен с «Реддогом». Вы должны использовать элемент управления gridview и передать объект Data в качестве источника данных в gridview. Также вы можете использовать JQGrid для сценариев на стороне клиента.

Смежные вопросы