Development Programs
datatable row 순서 변경 Winform 그리드의 상하 이동시키는 Row 이동 하기
AI 정보쟁이
2024. 5. 24. 11:34
반응형
개발을 하다보면


상하GridRow를 이동하는 로직이 필요할때가 있다.
상위 이동 로직
//이동시킬Row저장
List<DataRow> selectedRowsData = new List<DataRow>();
//선택된 그리드
foreach (var item in (grid.DataSource as DataTable).AsEnumerable().Where(x => (x["CHK"].SafeInt() == 1 || x["CHK"].SafeString() == "True")))
{
DataRow newRow = (grid.DataSource as DataTable).Clone().NewRow();
newRow.ItemArray = item.ItemArray;
//newRow.AcceptChanges();
selectedRowsData.Add(newRow);
}
bool isContinue = true;
for (int i = 0; i < (grid.DataSource as DataTable).Rows.Count; i++)
{
if (isContinue == false)
{
break;
}
//이동하기전Row
Dictionary<int, DataRow> selectedMoveRowsData = new Dictionary<int, DataRow>();
DataColumnCollection colums = (grid.DataSource as DataTable).Clone().Columns;
//selectedMoveRowsData[i]["WORK_SEQNO"]
//이동하기전에 Row는 한칸내리고
if (selectedRowsData.Any(x => x["PRCS_SEQNO"].SafeInt() == (grid.DataSource as DataTable).Rows[i]["PRCS_SEQNO"].SafeInt()))
{
//0보다 작을때는 패스
if (i - 1 < 0)
{
isContinue = false;
}
else
{
//이동시킬것 담고
if (selectedMoveRowsData.ContainsKey((grid.DataSource as DataTable).Rows[i]["PRCS_SEQNO"].SafeInt()) == false)
{
//(GRV_T2_D.DataSource as DataTable).Rows[i].ItemArray;
DataRow newRow = (grid.DataSource as DataTable).Clone().NewRow();
newRow.ItemArray = (grid.DataSource as DataTable).Rows[i - 1].ItemArray;
selectedMoveRowsData.Add((grid.DataSource as DataTable).Rows[i - 1]["PRCS_SEQNO"].SafeInt(), newRow);
//저장된 Row이동
for (int j = 0; j < colums.Count; j++)
{
//if (colums[j].ColumnName == "WORK_SEQNO_DP")
//{
//}
//else
{
(grid.DataSource as DataTable).Rows[i - 1][colums[j].ColumnName] = (grid.DataSource as DataTable).Rows[i][colums[j].ColumnName];
if (selectedMoveRowsData.Count == 1)
{
//마킹
(grid.DataSource as DataTable).Rows[i][colums[j].ColumnName] = selectedMoveRowsData.FirstOrDefault().Value[colums[j].ColumnName];//[(GRD_T2_D.DataSource as DataTable).Rows[i]["WORK_SEQNO"].SafeInt() - 1]
}
}
}
}
}
}
}
하위 이동 로직
//이동시킬Row저장
List<DataRow> selectedRowsData = new List<DataRow>();
foreach (var item in (grid.DataSource as DataTable).AsEnumerable().Where(x => (x["CHK"].SafeInt() == 1 || x["CHK"].SafeString() == "True")))
{
DataRow newRow = (grid.DataSource as DataTable).Clone().NewRow();
newRow.ItemArray = item.ItemArray;
//newRow.AcceptChanges();
selectedRowsData.Add(newRow);
}
bool isContinue = true;
//for (int i = 0; i < (GRD_T2_D.DataSource as DataTable).Rows.Count; i++)
for (int i = (grid.DataSource as DataTable).Rows.Count - 1; i >= 0; i--)
{
if (isContinue == false)
{
break;
}
//이동하기전Row
Dictionary<int, DataRow> selectedMoveRowsData = new Dictionary<int, DataRow>();
DataColumnCollection colums = (grid.DataSource as DataTable).Clone().Columns;
//이동하기전에 Row는 한칸내리고
if (selectedRowsData.Any(x => x["PRCS_SEQNO"].SafeInt() == (grid.DataSource as DataTable).Rows[i]["PRCS_SEQNO"].SafeInt()))
{
//Row보다 클때는 패스
if (i + 1 >= (grid.DataSource as DataTable).Rows.Count)
{
isContinue = false;
}
else
{
//이동시킬것 담고
if (selectedMoveRowsData.ContainsKey((grid.DataSource as DataTable).Rows[i]["PRCS_SEQNO"].SafeInt()) == false)
{
//(GRV_T2_D.DataSource as DataTable).Rows[i].ItemArray;
DataRow newRow = (grid.DataSource as DataTable).Clone().NewRow();
newRow.ItemArray = (grid.DataSource as DataTable).Rows[i + 1].ItemArray;
selectedMoveRowsData.Add((grid.DataSource as DataTable).Rows[i + 1]["PRCS_SEQNO"].SafeInt(), newRow);
//저장된 Row이동
for (int j = 0; j < colums.Count; j++)
{
//if (colums[j].ColumnName == "WORK_SEQNO_DP")
//{
//}
//else
{
(grid.DataSource as DataTable).Rows[i + 1][colums[j].ColumnName] = (grid.DataSource as DataTable).Rows[i][colums[j].ColumnName];
if (selectedMoveRowsData.Count == 1)
{
//마킹
(grid.DataSource as DataTable).Rows[i][colums[j].ColumnName] = selectedMoveRowsData.FirstOrDefault().Value[colums[j].ColumnName];//[(GRD_T2_D.DataSource as DataTable).Rows[i]["WORK_SEQNO"].SafeInt() - 1]
}
}
(grid.DataSource as DataTable).AcceptChanges();
}
}
}
}
}