본문 바로가기

Development Programs

datatable row 순서 변경 Winform 그리드의 상하 이동시키는 Row 이동 하기

반응형

개발을 하다보면

 

상하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();
                                }
                            }
                        }
                    }

                }