※ 테이블 피봇 (세로 -> 가로)
/// <summary>
/// DataTable를 CrossTab 형태로 변환한는 Class
/// </summary>
public class DataTable2CrossTab : DataTable
{
#region Convert()
public static DataTable Convert(DataTable Source, DataColumn[] RowColumns, DataColumn ColColumn, DataColumn DataColumn)
{
DataTable crossTab = null;
DataColumn[] dynamiccolumns = null;
#region UI Layer에서 MessageBox 처리없이, Exception을 처리하는 Block입니다.
try
{
if (Source != null)
{
crossTab = new DataTable(String.Format("{0}_CrossTab", Source.TableName));
// 1. CrossTab의 Rows의 값을 열을 구성한다.
crossTab.Merge(Distinct(Source, RowColumns));
// 2. CrossTab의 열을 구성할 Row를 만든다.
DataTable temp = Distinct(Source, ColColumn);
dynamiccolumns = new DataColumn[temp.Rows.Count];
for (int i = 0; i < temp.Rows.Count; i++)
{
//crossTab.Columns.Add(temp.Rows[i][ColColumn.ColumnName].ToString(), ColColumn.DataType);
crossTab.Columns.Add(temp.Rows[i][ColColumn.ColumnName].ToString(), DataColumn.DataType);
dynamiccolumns[i] = new DataColumn(temp.Rows[i][ColColumn.ColumnName].ToString(), DataColumn.DataType);
}
// 3. 데이터를 채운다.
foreach (DataRow dr in crossTab.Rows)
{
string filter = string.Empty;
for (int i = 0; i < RowColumns.Length; i++)
{
if (i == 0)
{
if (dr[RowColumns[i].ColumnName].ToString().Length > 0)
{
filter += String.Format("{0} = '{1}'", RowColumns[i].ColumnName, dr[RowColumns[i].ColumnName].ToString());
}
else
{
filter += String.Format("{0} is null", RowColumns[i].ColumnName);
}
}
else
{
if (dr[RowColumns[i].ColumnName].ToString().Length > 0)
{
filter += String.Format(" and {0} = '{1}'", RowColumns[i].ColumnName, dr[RowColumns[i].ColumnName].ToString());
}
else
{
filter += String.Format(" and {0} is null", RowColumns[i].ColumnName);
}
}
}
DataRow[] drs = Source.Select(filter);
for (int i = 0; i < drs.Length; i++)
{
dr[drs[i][ColColumn].ToString()] = drs[i][DataColumn].ToString();
}
}
crossTab.AcceptChanges();
}
}
catch (Exception ex) // 프로그램에서 예상하지 못한 Exception을 처리합니다.
{
throw ex;
}
finally // 더 이상 사용하지 않는 자원을 해제합니다.
{
}
#endregion
return crossTab;
}
#endregion
}
※ 테이블 피봇 (가로 -> 세로)
#region ConvertRow2Col()
/// <summary>
/// Row를 Column 으로 Column을 Row로 바꾸는 메소드
/// </summary>
/// <param name="Source">DataTable</param>
/// <param name="StardardColumn">기준컬럼</param>
/// <param name="DataType">데이터형</param>
/// <returns></returns>
public static DataTable ConvertRow2Col(DataTable Source, DataColumn StardardColumn, Type DataType)
{
DataTable dtNew = new DataTable();
// 기준컬럼 만들기
DataColumn dcCol = new DataColumn(StardardColumn.ColumnName, Type.GetType("System.String"));
dtNew.Columns.Add(dcCol);
// 기준컬럼에 해당하는 행을 컬럼으로 변환하기
DataColumn dcTemp = null;
foreach (DataRow row in Source.Rows)
{
if (StardardColumn.DataType == Type.GetType("System.DateTime"))
{
dcTemp = new DataColumn(row[StardardColumn].ToString().Substring(0, 10), DataType);
}
else
{
dcTemp = new DataColumn(row[StardardColumn].ToString(), DataType);
}
dtNew.Columns.Add(dcTemp);
}
// 기준 컬럼 Remove
Source.Columns.Remove(StardardColumn);
// 컬럼 정보를 행으로 변환
foreach (DataColumn col in Source.Columns)
{
DataRow dr = dtNew.NewRow();
dr[StardardColumn.ColumnName] = col.ColumnName;
dtNew.Rows.Add(dr);
}
for (int i = 0; i < Source.Columns.Count; i++)
{
for (int j = 0; j < Source.Rows.Count; j++)
{
dtNew.Rows[i][j+1] = Source.Rows[j][i];
}
}
dtNew.AcceptChanges();
return dtNew;
}
#endregion
'asp.net with c#' 카테고리의 다른 글
c# 연산자 (0) | 2012.02.01 |
---|---|
DataTable에 PrimaryKey 설정 (0) | 2012.01.10 |
DataTable Merge (0) | 2012.01.10 |
DataTable 중복된 값 제거 (0) | 2012.01.10 |
컨트롤 캡쳐 (0) | 2012.01.10 |