참조 : http://www.shblitz.net/92 , http://www.ezineasp.net/post/C-sharp-DataTable-Group-by-Example.aspx , http://duraboys.tistory.com/602
그리드뷰를 이용하여 각 레벨 별로 계정 코드에 맞게 rollup 하는 기능입니다.
DataTable 의 Select / Compute 기능을 이용
System.Data.DataTable dt_new = new System.Data.DataTable();
dt_new = dt.Copy(); //기존 데이타 테이블의 내용을 카피
dt_new.PrimaryKey = null; //PrimaryKey 키 오류가 발생하므로 초기화
DataRow[] row = dt.Select("LEVEL = 1");
int Lv1Count = int.Parse(dt.Compute("COUNT(LEVEL)", "LEVEL = 1").ToString()); // DataSet의 ID = 1인 레코드의 갯수
for (int j = 0; j < row.Length-1; j++)
{
string strLv2Code = row[j]["CODE"].ToString();
strLv2Code = strLv2Code.Substring(0, 2);
DataRow[] row1 = dt.Select("LEVEL = 2 and CODE like '" + strLv2Code + "%'");
double valueLv2 = 0;
for (int k = 0; k < row1.Length-1; k++)
{
string strLv3Code = row[j]["CODE"].ToString();
strLv3Code = strLv3Code.Substring(0, 4);
DataRow[] row2 = dt.Select("LEVEL = 3 and CODE like '" + strLv3Code + "%'");
double valueLv3 = 0;
for (int l = 0; l < row2.Length - 1; l++)
{
if (!string.IsNullOrEmpty(row[l][ColumnIndex].ToString()))
{
valueLv3 += Convert.ToDouble(row[l][ColumnIndex].ToString());
}
}
if (row2.Length != 0)
{
row1[k][ColumnIndex] = valueLv3;
dt_new.ImportRow(row1[k]);
}
if (!string.IsNullOrEmpty(row1[k][ColumnIndex].ToString()))
{
valueLv2 += Convert.ToDouble(row1[k][ColumnIndex].ToString());
}
}
if (row1.Length != 0)
{
row[j][ColumnIndex] = valueLv2;
dt_new.ImportRow(row[j]);
}
}