Dodatkową zaletą jest to, że jeśli uzyskasz więcej danych, w razie potrzeby zbudujesz więcej poziomych kolumn, ale nigdy nie przekroczysz 12 wierszy danych. Sposób "in-SQL" będzie wymagał zmian kodu, jeśli kiedykolwiek będziesz musiał wyświetlić więcej danych.
Zastrzeżenie :To jest całkowicie nietuzinkowe (C#, ponieważ do tego jestem przyzwyczajony). Prawdopodobnie są na to znacznie lepsze sposoby (Linq?) Logika powinna być dość zbliżona, ale daje to elastyczność w używaniu tej listy danych do innych celów niż ten bardzo wąsko skoncentrowany wyświetlacz.
DataTable dt = ResultsFromSproc();
DataTable outputDt = new DataTable();
//prebuild 12 rows in outputDt
int iRows = 12;
while(iRows > 0) {
outputDt.Rows.Add(new DataRow());
iRows-=1;
}
int outputColumn = 0;
for(int i = 0; i < dt.Rows.Count; i+=1){
DataRow dr = dt.Rows[i];
if(i % 12 == 0 && i > 0) {
//add two more columns to outputDt
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+2).ToString() should work
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+3).ToString() should work
outputColumn += 1;
}
outputDt.Rows[i%12][outputColumn] = dr[0];
outputDt.Rows[i%12][outputColumn + 1] = dr[1];
}
//Step2: Bind to outputDt. Step 3: Profit!
Wersja ALTERNATYWNA :Dla wymagania, aby val1 ==48 znajdowała się w komórce 48 (patrz komentarze)
DataTable dt = ResultsFromSproc();
DataTable outputDt = new DataTable();
//prebuild 12 rows in outputDt
int iRows = 12;
while(iRows > 0) {
outputDt.Rows.Add(new DataRow());
iRows-=1;
}
int outputColumn = 0;
int iMaxCell = (int)dt.Select("MAX(Val1)")[0][0];
//ASSUMING YOU HAVE ALREADY DONE AN ORDER BY Val1 in SQL (if not you need to sort it here first)
for(int i = 0; i < iMaxCell; i+=1){
DataRow dr = dt.Rows[i];
if(i % 12 == 0 && i > 0) {
//add two more columns to outputDt
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+2).ToString() should work
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+3).ToString() should work
outputColumn += 2;
}
//compare to i+1 if your data starts at 1
if((int)dr[0] == (i+1)){
outputDt.Rows[i%12][outputColumn] = dr[0];
outputDt.Rows[i%12][outputColumn + 1] = dr[1];
}
}
//Step2: Bind to outputDt. Step 3: Profit!