728x90
반응형
DataGrid 바탕화면으로 Drag&Drop 하여 파일 복사하기
xaml
<Grid>
<TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Search Directory" VerticalAlignment="Top" FontSize="24"/>
<Button Content="Search" HorizontalAlignment="Center" Width="100" Click="Button_Click" VerticalAlignment="Bottom" Margin="0,0,0,10"/>
<DataGrid x:Name="dataGrid01" Margin="10,60,10,50" AutoGenerateColumns="False"/>
</Grid>
cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
namespace SearchDirectory
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
SetGrid(); // 사용할 데이터 그리드 및 컬럼헤드 추가/설정 하기
}
// DataGrid 설정하기
void SetGrid()
{
// 사용할 데이터 그리드 및 컬럼헤드 추가/설정 하기
DataGrid dataGrid = dataGrid01;
List<string> columnHeaders = new List<string> { "Index", "Data" };
AddDataGridColumns(columnHeaders, dataGrid);
// 그리드에서 선택된 데이터를 바탕화면으로 이동/복사하기
lstSelectedFiles = new List<DataValuePair>();
dataGrid.PreviewMouseLeftButtonDown += DataGrid_PreviewMouseLeftButtonDown;
dataGrid.SelectionChanged += dataGrid_SelectionChanged;
dataGrid.MouseMove += dataGrid_MouseMove;
dataGrid.Drop += dataGrid_Drop;
dataGrid.AllowDrop = true;
dataGrid.AutoGenerateColumns = false;
}
//// 사용할 데이터 그리드 및 컬럼헤드 추가/설정 하기 -------------------------------------- 시작
private void AddDataGridColumns(List<string> columnHeaders, DataGrid dataGrid)
{
foreach (string header in columnHeaders)
{
DataGridTextColumn column = new DataGridTextColumn
{
Header = header,
Width = new DataGridLength(1, DataGridLengthUnitType.Auto),
Binding = new Binding(header)
};
dataGrid.Columns.Add(column);
}
}
// DataGrid 클래스 만들기
public class DataValuePair
{
public int Index { get; set; }
public string Data { get; set; }
}
// DataGrid 데이터에 옵저버컬렉션 연결하기
private ObservableCollection<DataValuePair> dataValue = new ObservableCollection<DataValuePair>();
//// 사용할 데이터 그리드 및 컬럼헤드 추가/설정 하기 -------------------------------------- 끝
//// 그리드에서 선택된 데이터를 바탕화면으로 이동/복사하기 -------------------------------------- 시작
private List<DataValuePair> lstSelectedFiles;
private void DataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DataGrid grid = sender as DataGrid;
// Ctrl 키를 누른 상태에서 드래그하는 경우만 처리
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{
lstSelectedFiles.Clear();
foreach (var selectedItem in dataGrid01.SelectedItems)
{
DataValuePair selectedFile = selectedItem as DataValuePair;
lstSelectedFiles.Add(selectedFile);
}
if (lstSelectedFiles.Count > 0)
{
DataObject dragData = new DataObject();
List<string> filePaths = new List<string>();
foreach (var selectedFile in lstSelectedFiles)
{
filePaths.Add(selectedFile.Data);
}
dragData.SetData(DataFormats.FileDrop, filePaths.ToArray());
DragDrop.DoDragDrop(dataGrid01, dragData, DragDropEffects.Copy | DragDropEffects.Move);
}
}
}
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
lstSelectedFiles.Clear();
foreach (var selectedItem in dataGrid01.SelectedItems)
{
DataValuePair selectedFile = selectedItem as DataValuePair;
lstSelectedFiles.Add(selectedFile);
}
}
private void dataGrid_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed && lstSelectedFiles.Count > 0)
{
DataGrid grid = sender as DataGrid;
DataObject dragData = new DataObject();
List<string> filePaths = new List<string>();
foreach (var selectedFile in lstSelectedFiles)
{
filePaths.Add(selectedFile.Data);
}
dragData.SetData(DataFormats.FileDrop, filePaths.ToArray());
DragDrop.DoDragDrop(grid, dragData, DragDropEffects.Copy | DragDropEffects.Move);
}
}
private void dataGrid_Drop(object sender, DragEventArgs e)
{
try
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] droppedFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
foreach (string filePath in droppedFiles)
{
string fileName = Path.GetFileName(filePath);
string destinationPath = Path.Combine(desktopPath, fileName);
File.Copy(filePath, destinationPath); // 또는 File.Move(filePath, destinationPath);
}
}
}
catch { }
}
//// 그리드에서 선택된 데이터를 바탕화면으로 이동/복사하기 -------------------------------------- 끝
int Index = 1;
private void Button_Click(object sender, RoutedEventArgs e)
{
dataValue.Clear();
string dir = Environment.CurrentDirectory + @"\test\";
Index = 1;
dirSearch(dir);
dataGrid01.ItemsSource = dataValue;
}
// 폴더 체크
private void dirSearch(string dir)
{
string[] Directories = Directory.GetDirectories(dir); // Defalut Folder
{
string[] Files = Directory.GetFiles(dir); // File list Search
foreach (string fileName in Files) // File check
{
dataValue.Add(new DataValuePair { Data = fileName, Index = Index++ });
}
foreach (string nodeDir in Directories) // Folder list Search
{
// dataValue.Add(new DataValuePair { Data = nodeDir, Type = "Dir" });
dirSearch(nodeDir); // reSearch
}
}
}
/// <summary>
/// GetDropFilesPaths 드랍파일 가져오기
/// </summary>
/// <param name="e">DropData</param>
/// <returns>DropFiles</returns>
private List<string> GetDropFilesPaths(DragEventArgs e, bool deduplication = false)
{
string[] eDataFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
List<string> lstFile = new List<string>();
foreach (string eDataFile in eDataFiles)
{
try
{
// 폴더이면 하위폴더 파일가져오기
if ((File.GetAttributes(eDataFile) & FileAttributes.Directory) == FileAttributes.Directory)
{
// var filesss = Directory.EnumerateFiles(eDataFile, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg"));
var filesss = Directory.EnumerateFiles(eDataFile, "*.*", SearchOption.AllDirectories); // 하위폴더 포함
lstFile.AddRange(filesss);
}
// 파일이면 파일가져오기
else if ((File.GetAttributes(eDataFile) & FileAttributes.Directory) != FileAttributes.Directory)
{
lstFile.Add(eDataFile);
}
}
catch
{
MessageBox.Show("가져오지 못한 파일 또는 폴더가 있습니다.");
continue;
}
}
// 중복데이터제거
if (deduplication)
lstFile.Distinct();
return lstFile;
}
}
}
WPF & C# 프로그램의 dataGrid 에서 파일을 바탕화면으로 드래그앤드롭하여 이동/복사 하는 방법 이다.
최대한 간결하게 하려고 dataGrid 에 대한 설정도 코드에서 작성했다.
728x90
반응형
'Programing (프로그래밍) > WPF & C# (C Sharp)' 카테고리의 다른 글
WPF & C# - 트레이아이콘 ( TrayIcon / notifyIcon ) (0) | 2024.07.19 |
---|---|
WPF & C# - 엑셀 읽기 쓰기 ( Microsoft.Office.Interop.Excel ) (0) | 2024.03.03 |
WPF & C# - ASCII or HEX 구분 방법 ( 아스키 ) (0) | 2023.12.30 |
WPF C# HttpClient vs WebRequest 장단점 (0) | 2023.08.20 |
WPF & C# - 엑셀없이 엑셀파일 빠르게 읽기 ( XLS, XLSX, ExcelDataReader, EXCEL ) (0) | 2023.03.12 |
[자작] WPF & C# - isIPSCAN( Ping Test Program / 맥주소 / MACaddress / 호스트명 / HostName / 닉네임 / NicName / 핑 테스트 ) (0) | 2022.11.13 |
WPF & C# - Array Index Check ( 배열 인덱스 내외 여부 체크 확인 ) (0) | 2022.10.15 |
WPF & C# - Style 스타일 적용하기 ( Setter / Window.Resources ) (2) | 2022.10.15 |