본문 바로가기

카테고리 없음

Devexpress GridControl 엑셀처럼 복사 붙여넣기 가능하게

반응형

view.OptionsSelection.MultiSelect = true;

view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CellSelect;

 public static void SetConnectionCopyEnableEvent(this DevExpress.XtraGrid.Views.Grid.GridView gridView, System.Windows.Forms.Control control,  AllowEdit allowEdit = AllowEdit.EditTrue)
        {
            gridView.OptionsBehavior.ImmediateUpdateRowPosition = true;

            bool pasting = false;

            gridView.ShowingEditor += (sender, e) =>
            {
                if (pasting)
                {
                    e.Cancel = true; 
                    pasting = false;
                }
            };
            gridView.KeyDown += (sender, e) =>
            {

                try
                {
                    GridView view = sender as GridView;
                    if (e.Control && e.KeyCode == Keys.C)
                    {
                        var selectedCells = view.GetSelectedCells();

                        if (selectedCells.Length > 1)
                        {
                            Dictionary<int, List<string>> rowData = new Dictionary<int, List<string>>();

                            foreach (var cell in selectedCells)
                            {
                                var cellValue = view.GetRowCellValue(cell.RowHandle, cell.Column)?.ToString() ?? string.Empty;

                                if (!rowData.ContainsKey(cell.RowHandle))
                                {
                                    rowData[cell.RowHandle] = new List<string>();
                                }

                                rowData[cell.RowHandle].Add(cellValue);
                            }

                            StringBuilder copiedText = new StringBuilder();

                            foreach (var row in rowData)
                            {
                                copiedText.Append(string.Join("\t", row.Value)); // 열 데이터는 탭으로 구분
                                copiedText.Append(Environment.NewLine); // 행 끝에는 줄바꿈 추가
                            }

                            Clipboard.SetText(copiedText.ToString());

                        }
                        else
                        if (view.GetRowCellValue(view.FocusedRowHandle, view.FocusedColumn) != null /*&& view.GetRowCellValue(view.FocusedRowHandle, view.FocusedColumn).ToString() != String.Empty*/)
                            Clipboard.SetText(view.GetRowCellValue(view.FocusedRowHandle, view.FocusedColumn).ToString());
                        else
                             "셀이 선택되지 않았습니다." 
                        e.Handled = true;
                    }

                    else if (e.Control && e.KeyCode == Keys.V)
                    {
                        try
                        {
                            pasting = true;
                            e.Handled = true;
                            gridView.CloseEditor(); // 편집 상태 종료
                            gridView.CancelUpdateCurrentRow(); // 변경 사항 취소
                            // 클립보드에 있는 데이터를 가져옴
                            string clipboardText = Clipboard.GetText();

                                    // 클립보드에서 가져온 행과 열의 수 계산
                                    string[] rows = clipboardText.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
                                    int clipboardRowCount = rows.Length;
                                    if (rows.Length >= 2)
                                    {
                                        clipboardRowCount = clipboardRowCount - 1;
                                    }
                                    int clipboardColumnCount = rows.Max(row => row.Split('\t').Length);

                                    // 선택된 셀의 인덱스 가져오기
                                    int startRow = gridView.FocusedRowHandle;
                                    int startColumn = gridView.FocusedColumn.VisibleIndex;

                                    // 클립보드 데이터를 그리드 셀에 복사
                                    int currentRow = startRow;
                                    int currentColumn = startColumn;

                                    for (int i = 0; i < clipboardRowCount; i++)
                                    {
                                        string[] cells = rows[i].Split('\t');

                                        for (int j = 0; j < clipboardColumnCount; j++)
                                        {
                                            // 그리드 셀의 행과 열이 부족한 경우, 복사하지 않음
                                            if (currentRow < gridView.RowCount && currentColumn < gridView.Columns.Count)
                                            {
                                                //gridView.PostEditor();
                                                //gridView.UpdateCurrentRow();
                                                switch (allowEdit)
                                                {
                                                    case AllowEdit.ALL:
                                                        gridView.SetRowCellValue(currentRow, gridView.VisibleColumns[currentColumn], cells[j]);
                                                        break;
                                                    case AllowEdit.EditFalse:
                                                        if (gridView.VisibleColumns[currentColumn].OptionsColumn.AllowEdit == false)
                                                        {
                                                            gridView.SetRowCellValue(currentRow, gridView.VisibleColumns[currentColumn], cells[j]);
                                                        }
                                                        break;
                                                    case AllowEdit.EditTrue:
                                                        if (gridView.VisibleColumns[currentColumn].OptionsColumn.AllowEdit == true)
                                                        {
                                                            gridView.SetRowCellValue(currentRow, gridView.VisibleColumns[currentColumn], cells[j]);
                                                        }
                                                        break;
                                                    default:
                                                        break;
                                                }

                                                //gridView.PostEditor();
                                                //gridView.UpdateCurrentRow();
                                            }

                                            gridView.UpdateCurrentRow();
                                            // 다음 열로 이동
                                            currentColumn++;
                                        }

                                        // 다음 행으로 이동
                                        currentRow++;
                                        currentColumn = startColumn;
                                    }

                                    gridView.PostEditor();
                                    gridView.UpdateCurrentRow();

                                    //gridView.RefreshData();
                                    //e.Handled = true;
                                }

                            }
                        }
                        catch (Exception ex)
                        {

                        }
                    }
                }
                catch (Exception ex)
                {

                }
                finally
                {

                }
            };

        }