반응형
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
{
}
};
}