출처 http://akddd.net/188

개인적인 공간...TagMedia LogLocation LogGuest BookAdminWrite 

--------------------------------------------------------------------------------

위에 싸이트가 자세히 되어있을겁니다.
갑자기 사라지는것이 많아. 일단 위치저장~~.


--------------------------------------------------------------------------------

[C#] UltraWinGrid 및 C# 팁정리
.NET (C#)
2009/03/10 11:27
 
Posted by memorys
[C#] UltraWinGrid 및 C# 팁정리

DataTable에 PrimaryKey설정

DataColumn[] dc = new DataColumn[1];
dc[0] = dt.Columns[0];
dt.PrimaryKey = dc;
dt.AcceptChanges();

-----------------------------------------------------------
DataTable Merge
DataTable dtTemp = dt.Clone();
// PrimaryKey 셋팅(Merge할때 기본키값을 설정하지 않으면 테이블 Merge시 중복된 데이터가 들어갈수 있습니다.
dtTemp.PrimaryKey = new DataColumn[] { dtTemp.Columns[0] };
dtTemp.Merge(dt);

-----------------------------------------------------------
UltraWinGrid Cell에 동적으로 Text변경
// UltraGrid.ActiveCell.Text 가 ReadOnly속성이라 값 셋팅이 안되서 삽질좀 했음 ㅠ
UltraGrid.ActiveCell.SetValue(value, false);

-----------------------------------------------------------
UltraWinGrid에서 변경된값과 변경 전 값 비교
grid.ActiveCell.OriginalValue.Equals(sTmpEmno)

-----------------------------------------------------------
입력된 문자열의 byte수 구하기
Encoding ec = Encoding.GetEncoding("euc-kr");
int iTmp = ec.GetByteCount(grid.ActiveCell.Text);
참고 : Encoding 목록

-----------------------------------------------------------
DataTable에 존재하는 Data중 중복된 값 제거하기

그다지 맘에 들지 않지만.. ㅠ
#region Row, Row를 비교한다.
public static bool RowEqual(object[] Values, object[] OtherValues)
{
    if (Values == null) return false;
    for (int i = 0; i < Values.Length; i++)
    {
        if (!Values[i].Equals(OtherValues[i])) return false;
    }
    return true;
}
#endregion
#region 데이터테이블을 distinct한다.
public static DataTable Distinct(DataTable Table, DataColumn[] Columns)
{
    DataTable dt = null;
    string sort = string.Empty;
    try
    {
        if (Table != null)
        {
            dt = new DataTable("Distinct");
            for (int i = 0; i < Columns.Length; i++)
             {
                dt.Columns.Add(Columns[i].ColumnName, Columns[i].DataType);
                sort += Columns[i].ColumnName + ",";
            }

            object[] currentrow = null;
            object[] previousrow = null;
            DataRow[] sortedrows = Table.Select(string.Empty, sort.Substring(0, sort.Length - 1));
            dt.BeginLoadData();
            foreach (DataRow row in sortedrows)
            {
                currentrow = new object[Columns.Length];
                for (int i = 0; i < Columns.Length; i++)
                {
                    currentrow[i] = row[Columns[i].ColumnName];
                }
                if (!RowEqual(previousrow, currentrow))
                {
                    dt.LoadDataRow(currentrow, true);
                }
                previousrow = new object[Columns.Length];
                for (int i = 0; i < Columns.Length; i++)
                {
                    previousrow[i] = row[Columns[i].ColumnName];
                }
            }
            dt.EndLoadData();
        }
    }
    catch (Exception ex) // 프로그램에서 예상하지 못한 Exception을 처리합니다.
    {
        throw ex;
    }
    finally // 더 이상 사용하지 않는 자원을 해제합니다.
    {
    }
    return dt;
}


테이블 피봇 (세로 -> 가로)

/// <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
Trackback 0 Comment 2
Trackback :: http://akddd.net/trackback/188 
 

Posted by 말없제이
,