개인적인 공간...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