프로그램/C#

C# 리스트뷰(ListView) 사용하기

더월드 2023. 8. 29.

C#에서 listview 익히기

 

폴더를 리스트뷰에 드래그앤드롭해서 파일해시 계산하는 예제를 통해서 리스트뷰를 사용해 보겠습니다.

아래와 같은 형태로 폼뷰를 만듭니다.

 

리스트뷰(ListView) 해더 추가

- 리스트뷰 속성을 설정

    // Set the view to show details.
    file_listView.View = View.Details;
    // Allow the user to edit item text.
    file_listView.LabelEdit = true;
    // Allow the user to rearrange columns.
    file_listView.AllowColumnReorder = true;
    // Display check boxes.
    //logparser_listView.CheckBoxes = true;
    // Select the item and subitems when selection is made.
    file_listView.FullRowSelect = true;
    // Display grid lines.
    file_listView.GridLines = true;
    // Sort the items in the list in ascending order.
    //logparser_listView.Sorting = SortOrder.Ascending;

 

- 리스트뷰 해더를 추가합니다.

    ColumnHeader columnHeader1 = new Syste m.Windows.Forms.ColumnHeader(); 
    columnHeader1.Text = "연번"; //1열 제목 추가
    file_listView.Columns.Add(columnHeader1.Text, -2, HorizontalAlignment.Left);

    ColumnHeader columnHeader10 = new Syste m.Windows.Forms.ColumnHeader(); 
    columnHeader10.Text = "파일"; //1열 제목 추가
    file_listView.Columns.Add(columnHeader2.Text);

 

- 리스트뷰 셀 크기를 설정합니다.

    // 내용에 따라 자동변환

    file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);

 

    // 헤더에 따라 자동변환
    file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); 

private void file_listview_header()
{
    // Set the view to show details.
    file_listView.View = View.Details;
    // Allow the user to edit item text.
    file_listView.LabelEdit = true;
    // Allow the user to rearrange columns.
    file_listView.AllowColumnReorder = true;
    // Display check boxes.
    //logparser_listView.CheckBoxes = true;
    // Select the item and subitems when selection is made.
    file_listView.FullRowSelect = true;
    // Display grid lines.
    file_listView.GridLines = true;
    // Sort the items in the list in ascending order.
    //logparser_listView.Sorting = SortOrder.Ascending;

    ColumnHeader columnHeader1 = new System.Windows.Forms.ColumnHeader();
    columnHeader1.Text = "연번"; //1열 제목 추가
    file_listView.Columns.Add(columnHeader1.Text, -2, HorizontalAlignment.Left);

    ColumnHeader columnHeader10 = new System.Windows.Forms.ColumnHeader();
    columnHeader10.Text = "파일"; //1열 제목 추가
    file_listView.Columns.Add(columnHeader10.Text);

    // file_modify_checkBox
    if (file_modify_checkBox.Checked == true)
    {
        ColumnHeader columnHeader2 = new System.Windows.Forms.ColumnHeader();
        columnHeader2.Text = "수정일"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader2.Text);
    }
    // file_size_checkBox
    if (file_size_checkBox.Checked == true)
    {
        ColumnHeader columnHeader3 = new System.Windows.Forms.ColumnHeader();
        columnHeader3.Text = "크기"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader3.Text, -2, HorizontalAlignment.Right);

    }
    // file_path_checkBox           
    if (file_path_checkBox.Checked == true)
    {
        ColumnHeader columnHeader4 = new System.Windows.Forms.ColumnHeader();
        columnHeader4.Text = "경로"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader4.Text, -2, HorizontalAlignment.Left);
    }
    // file_md5_checkBox
    if (file_md5_checkBox.Checked == true)
    {
        ColumnHeader columnHeader5 = new System.Windows.Forms.ColumnHeader();
        columnHeader5.Text = "MD5"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader5.Text);
    }
    // file_sha1_checkBox
    if (file_sha1_checkBox.Checked == true)
    {
        ColumnHeader columnHeader6 = new System.Windows.Forms.ColumnHeader();
        columnHeader6.Text = "SHA1"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader6.Text);
    }
    // file_create_checkBox
    if (file_create_checkBox.Checked == true)
    {
        ColumnHeader columnHeader7 = new System.Windows.Forms.ColumnHeader();
        columnHeader7.Text = "생성일"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader7.Text);
    }
    // file_access_checkBox
    if (file_access_checkBox.Checked == true)
    {
        ColumnHeader columnHeader8 = new System.Windows.Forms.ColumnHeader();
        columnHeader8.Text = "실행일"; //1열 제목 추가
        file_listView.Columns.Add(columnHeader8.Text, -2, HorizontalAlignment.Left);
    }

    //file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
    file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); // 헤더에 따라 자동변환
}

 

리스트뷰(ListView) 내용 추가

private void file_add_item(string _path)
{
    var info = new FileInfo(_path);
    ListViewItem item0 = new ListViewItem();

 

    //연번
    item0.Text = String.Format("{0}", file_cnt);

    //파일명
    item0.SubItems.Add(String.Format("{0}", info.Name));
    //Log_print(String.Format("파일명: {0}", info.Name));
    .....
    file_listView.Items.Add(item0);
    file_cnt++;
}

private void file_add_item(string _path)
{
    // 파일을 만나게 되면 실제 해야할 액션을 코딩한다
    //Log_print(_path);

    var info = new FileInfo(_path);

    ListViewItem item0 = new ListViewItem();

    //연번
    item0.Text = String.Format("{0}", file_cnt);
    //Log_print(String.Format("연번: {0}", file_cnt));

    //파일명
    item0.SubItems.Add(String.Format("{0}", info.Name));
    //Log_print(String.Format("파일명: {0}", info.Name));

    // 수정일
    // file_modify_checkBox
    if (file_modify_checkBox.Checked == true)
    {
        item0.SubItems.Add(String.Format("{0}", info.LastWriteTime));
        //Log_print(String.Format("수정일: {0}", info.LastWriteTime));
    }
    // 파일크기
    // file_size_checkBox
    if (file_size_checkBox.Checked == true)
    {
        
        //string str = string.Format("{0:#,###}", num)
        item0.SubItems.Add(String.Format("{0:#,###}", info.Length));
    }
    // file_path_checkBox           
    if (file_path_checkBox.Checked == true)
    {
        item0.SubItems.Add(String.Format("{0}", info.FullName));
    }
    // file_md5_checkBox
    if (file_md5_checkBox.Checked == true)
    {
        item0.SubItems.Add(String.Format("{0}", file_md5(_path)));
    }
    // file_sha1_checkBox
    if (file_sha1_checkBox.Checked == true)
    {
        item0.SubItems.Add(String.Format("{0}", file_sha1(_path)));
    }
    // file_create_checkBox
    if (file_create_checkBox.Checked == true)
    {
        item0.SubItems.Add(String.Format("{0}", info.CreationTime));
    }
    // file_access_checkBox
    if (file_access_checkBox.Checked == true)
    {
        item0.SubItems.Add(String.Format("{0}", info.LastAccessTime));
    }

    file_listView.Items.Add(item0);

    file_cnt++;
}

 

리스트뷰(ListView) 드래그앤드롭

①. 속성창에서 AllowDrop 을 True로 변경

②. DragEnter, DragDrop 이벤트 핸들러 추가

private void file_listView_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effect = DragDropEffects.Copy | DragDropEffects.Scroll;
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }
}

private void file_listView_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] files = e.Data.GetData(DataFormats.FileDrop, true) as string[];

        Log_print("파일 해시 계산 시작!!");
        file_cnt = 1;
        foreach (string file in files)
        {
            //chkDir_recursive(file);

            FileAttributes chkAtt = File.GetAttributes(file);
            if ((chkAtt & FileAttributes.Directory) == FileAttributes.Directory)
            {
                // 디렉토리일 경우
                // 루트 디렉터리와 모든 하위 디렉터리에 있는 파일 목록을 가져옵니다.
                string[] tmpfiles = Directory.GetFiles(file, "*", SearchOption.AllDirectories);
                //string[] tmpfiles = Directory.GetFiles(inputfoldername1, "*.*");

                //Log_print(String.Format("{0}", tmpfiles));
                foreach (string tempFile in tmpfiles)
                {
                    //Log_print(tempFile);
                    file_add_item(tempFile);
                }
            }
            else
            {
                //Log_print(String.Format("{0}", file));
                //Log_print(file);
                file_add_item(file);
            }

        }               
        //모든 열 사이즈 자동조절
        file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);

        Log_print(String.Format("{0} 파일 해시 계산 완료!!", (file_cnt-1)));
    }
    else
    {
        Log_print("error ");
    }
}

 

리스트뷰(ListView) 전체선택(Ctrl+A), 복사(Ctrl+C) 하기

①. KeyDown 이벤트 핸들러 추가

Ctrl + A 키를 누를때와

Ctrl + C 키를 누를때 할 행위에 대해서 정의해줍니다.

private void file_listView_KeyDown(object sender, KeyEventArgs e)
{
    //콘트롤 + A 누르면
    if (e.KeyCode == Keys.A && e.Control)
    {
        file_listView.MultiSelect = true;
        foreach (ListViewItem item in file_listView.Items)
        {
            item.Selected = true;
        }
        Log_print("전체 내용 선택(Ctrl+A) 합니다.");
    }

    //콘트롤 + C 누르면
    if (e.Control && e.KeyCode == Keys.C)
    {
        Log_print("전체 내용을 복사(Ctrl+C) 합니다.");
        CopyListBox((System.Windows.Forms.ListView)sender);

    }
}

private void CopyListBox(ListView list)
{
    StringBuilder sb = new StringBuilder();

    // Head 복사하기
    String columnheader = "";
    for (int i = 0; i < file_listView.Columns.Count; i++)
    {
        columnheader += file_listView.Columns[i].Text + "\t";
    }

    sb.Append(columnheader);
    sb.AppendLine();

    // 내용 복사하기
    foreach (var item in list.SelectedItems)
    {
        ListViewItem l = item as ListViewItem;
        if (l != null)
        {                    
            foreach (ListViewItem.ListViewSubItem sub in l.SubItems)
            {
                sb.Append(sub.Text + "\t");
            }
        }
        sb.AppendLine();
    }
    Clipboard.SetDataObject(sb.ToString().Trim());
}

 

 

파일 해시 MD5, SHA1, SHA256 계산

using System.Security.Cryptography;

//--------------------------
// 파일 해시 MD5 계산
//--------------------------
private String file_md5(String FilePath)
{
    return ComputeHash(FilePath, new MD5CryptoServiceProvider());
}

//--------------------------
// 파일 해시 SHA1 계산
//--------------------------
private String file_sha1(String FilePath)
{
    return ComputeHash(FilePath, new SHA1CryptoServiceProvider());
}

//--------------------------
// 파일 해시 SHA256 계산
//--------------------------
private String file_sha256(String FilePath)
{
    return ComputeHash(FilePath, new SHA256CryptoServiceProvider());
}

//--------------------------
// 파일 해시 계산 알고리즘
//--------------------------
private string ComputeHash(string FilePath, HashAlgorithm Algorithm)
{
    FileStream FileStream = File.OpenRead(FilePath);

    try
    {
        byte[] HashResult = Algorithm.ComputeHash(FileStream);
        string ResultString = BitConverter.ToString(HashResult).Replace("-", "");
        return ResultString;
    }
    finally
    {
        FileStream.Close();
    }
}

 

파일 저장 버튼 처리

 

특정 ListView를 csv로 저장하는 함수

// 파일 저장 버튼 처리
private void file_save_button_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    
    // Head 입력하기
    String columnheader = "";
    for (int i = 0; i < file_listView.Columns.Count; i++)
    {
        columnheader += file_listView.Columns[i].Text + "\t";
    }

    sb.Append(columnheader);
    sb.AppendLine();

    // 내용
    foreach (var item in file_listView.Items)
    {
        ListViewItem l = item as ListViewItem;
        if (l != null)
        {
            foreach (ListViewItem.ListViewSubItem sub in l.SubItems)
            {
                sb.Append(sub.Text + "\t");
            }
        }
        sb.AppendLine();
    }


    try
    {
        string output_filename = "";
        String out_path1 = "\\filehash_" + @DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");

        SaveFileFolder = System.IO.Directory.GetCurrentDirectory();
        //output_filename = SaveFileFolder + out_path1
        output_filename = String.Format("{0}{1}.csv", SaveFileFolder, out_path1);

        FileDialog filedlg = new System.Windows.Forms.SaveFileDialog();

        filedlg.InitialDirectory = SaveFileFolder; // 초기 저장 디렉토리, 지정하지 않으면 마지막으로 작업한 폴더를 연다

        filedlg.FileName = output_filename;
        filedlg.Filter = "Excel File (*.csv)|*.csv";

        if (DialogResult.Cancel == filedlg.ShowDialog())
            return;

        if (filedlg.FileName != "")
            output_filename = filedlg.FileName;
        else
            return;


        StreamWriter sw = new StreamWriter(output_filename, true);
        sw.Write(sb.ToString());
        sw.Close();
        Log_print("------------------------------------");
        Log_print(String.Format("저장위치: {0}", output_filename));
        Log_print("파일 해시 결과 저장 완료!!");
        Log_print("------------------------------------");
    }
    catch (Exception err)
    {
        Log_print(err.Message);
    }
}

 

여러 ListView 내용을 CSV 파일로 저장하는 방법

// ListView 를 CSV로 저장하기
private void ListViewExportCSV(System.Windows.Forms.ListView lv, string strFileName)
{
    string filename;
    FileDialog filedlg = new System.Windows.Forms.SaveFileDialog();

    filedlg.FileName = strFileName;
    filedlg.Filter = "Excel File (*.csv)|*.csv";

    if (DialogResult.Cancel == filedlg.ShowDialog())
        return;

    if (filedlg.FileName != "")
        filename = filedlg.FileName;
    else
        return;


    try
    {
        if (File.Exists(filename))
            File.Delete(filename);

        StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);

        // Head 입력하기
        String columnheader = "";
        for (int i = 0; i < lv.Columns.Count; i++)
        {
            columnheader += lv.Columns[i].Text + "\t";
        }
        sw.WriteLine(columnheader);


        string strText = "";
        // 내용 입력하기
        for (int i = 0; i < lv.Items.Count; i++)
        {
            strText = "";

            for (int j = 0; j < lv.Columns.Count; j++)
            {
                strText += lv.Items[i].SubItems[j].Text.Replace("\r", "").Replace("\n", "") + "\t";
            }
            sw.WriteLine(strText);
        }

        sw.Close();

        MessageBox.Show("저장 완료!");
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message);
    }
}

 

 

클리어 버튼

- 리스트뷰를 클리어한다.

- 로그 박스를 클리어한다.

private void file_button_Click(object sender, EventArgs e)
{
    file_listView.Clear();
    file_listview_header();

    file_richTextBox.Clear();
    Application.DoEvents();
}

 

댓글

💲 추천 글