본문 바로가기

Programing (프로그래밍)/WPF & C# (C Sharp)

WPF & C# - DataGrid 바탕화면으로 Drag&Drop 하여 파일 복사하기 ( DragnDrop 데이터 그리드 데이타그리드 )

728x90
반응형

SearchDirectory.exe
0.01MB
SearchDirectory.zip
0.06MB

 

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
반응형