Phần thưởng cho điều này là nếu bạn kết thúc với nhiều dữ liệu hơn, nó sẽ chỉ tạo thêm các cột ngang nếu cần nhưng không bao giờ vượt quá 12 hàng dữ liệu. Cách "in-SQL" sẽ yêu cầu thay đổi mã nếu bạn cần hiển thị thêm dữ liệu.
Tuyên bố từ chối trách nhiệm :Điều này hoàn toàn không đúng (C # vì đó là những gì tôi đã từng làm). Có lẽ có nhiều cách tốt hơn để làm điều này (Linq?) Logic phải khá chặt chẽ, nhưng điều này cho phép bạn sử dụng danh sách dữ liệu đó cho các mục đích khác một cách linh hoạt hơn so với cách hiển thị tập trung rất hẹp này.
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!
Phiên bản ALTERNATE :Đối với yêu cầu rằng val1 ==48 đi vào ô 48 (xem nhận xét)
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!