[C#] ListViewイベントの使い方と活用法

C#のListViewは、リスト形式でデータを表示するためのコントロールで、ユーザーインターフェースの一部としてよく使用されます。

ListViewには様々なイベントがあり、これらを活用することでインタラクティブなアプリケーションを構築できます。

例えば、SelectedIndexChangedイベントは、ユーザーがリスト内の項目を選択したときに発生し、選択された項目に基づいて処理を行うことができます。

また、ItemActivateイベントは、ユーザーが項目をダブルクリックしたときに発生し、詳細情報の表示や編集画面の呼び出しに利用されます。

ColumnClickイベントは、列ヘッダーがクリックされたときに発生し、データの並べ替え機能を実装する際に役立ちます。

これらのイベントを適切に活用することで、ユーザーの操作に応じた動的なUIを実現できます。

この記事でわかること
  • ListViewの基本的なイベントの使い方
  • イベントを活用した具体的な応用例
  • ListViewのパフォーマンス向上策
  • カスタム描画の実装方法
  • ユーザーインターフェースの向上手法

目次から探す

ListViewのイベント

イベントの概要

ListViewは、Windowsフォームアプリケーションでデータをリスト形式で表示するためのコントロールです。

ListViewには、ユーザーの操作に応じて発生するさまざまなイベントがあります。

これらのイベントを活用することで、ユーザーインターフェースをよりインタラクティブにすることができます。

主なイベントには、選択の変更、項目のアクティベート、列のクリック、マウスのクリック、ダブルクリックなどがあります。

SelectedIndexChangedイベント

SelectedIndexChangedイベントは、ListView内の選択された項目が変更されたときに発生します。

このイベントを利用することで、選択された項目に基づいて他の情報を表示したり、処理を実行したりすることができます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.SelectedIndexChanged += ListView1_SelectedIndexChanged;
    }
    private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            string selectedItem = listView1.SelectedItems[0].Text; // 選択された項目のテキストを取得
            MessageBox.Show($"選択された項目: {selectedItem}"); // メッセージボックスで表示
        }
    }
}

選択された項目が変更されると、メッセージボックスにその項目のテキストが表示されます。

ItemActivateイベント

ItemActivateイベントは、ListView内の項目がアクティベートされたときに発生します。

通常、項目がダブルクリックされたときにこのイベントが発生します。

このイベントを利用して、選択された項目の詳細情報を表示することができます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.ItemActivate += ListView1_ItemActivate;
    }
    private void ListView1_ItemActivate(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            string selectedItem = listView1.SelectedItems[0].Text; // 選択された項目のテキストを取得
            MessageBox.Show($"項目がアクティベートされました: {selectedItem}"); // メッセージボックスで表示
        }
    }
}

項目をダブルクリックすると、その項目のテキストがメッセージボックスに表示されます。

ColumnClickイベント

ColumnClickイベントは、ListViewの列ヘッダーがクリックされたときに発生します。

このイベントを利用して、データの並べ替えを実装することができます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.ColumnClick += ListView1_ColumnClick;
    }
    private void ListView1_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        // 列のインデックスに基づいてデータを並べ替える処理を実装
        MessageBox.Show($"列 {e.Column} がクリックされました"); // メッセージボックスで表示
    }
}

列ヘッダーをクリックすると、どの列がクリックされたかを示すメッセージボックスが表示されます。

MouseClickイベント

MouseClickイベントは、ListView内でマウスがクリックされたときに発生します。

このイベントを利用して、特定の項目に対する操作を実行することができます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.MouseClick += ListView1_MouseClick;
    }
    private void ListView1_MouseClick(object sender, MouseEventArgs e)
    {
        ListViewItem item = listView1.GetItemAt(e.X, e.Y); // クリックした位置の項目を取得
        if (item != null)
        {
            MessageBox.Show($"項目がクリックされました: {item.Text}"); // メッセージボックスで表示
        }
    }
}

ListView内の項目をクリックすると、その項目のテキストがメッセージボックスに表示されます。

MouseDoubleClickイベント

MouseDoubleClickイベントは、ListView内でマウスがダブルクリックされたときに発生します。

このイベントを利用して、項目の詳細情報を表示することができます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.MouseDoubleClick += ListView1_MouseDoubleClick;
    }
    private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ListViewItem item = listView1.GetItemAt(e.X, e.Y); // クリックした位置の項目を取得
        if (item != null)
        {
            MessageBox.Show($"項目がダブルクリックされました: {item.Text}"); // メッセージボックスで表示
        }
    }
}

項目をダブルクリックすると、その項目のテキストがメッセージボックスに表示されます。

ListViewイベントの活用法

選択された項目の情報を取得する

ListViewのSelectedIndexChangedイベントを利用して、ユーザーが選択した項目の情報を取得し、他のコントロールに表示することができます。

これにより、ユーザーは選択した項目に関連する詳細情報を簡単に確認できます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.SelectedIndexChanged += ListView1_SelectedIndexChanged;
    }
    private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            string selectedItem = listView1.SelectedItems[0].Text; // 選択された項目のテキストを取得
            labelInfo.Text = $"選択された項目: {selectedItem}"; // ラベルに表示
        }
    }
}

選択された項目が変更されると、ラベルにその項目のテキストが表示されます。

項目のダブルクリックで詳細画面を表示する

ItemActivateイベントを使用して、ListView内の項目がダブルクリックされたときに詳細画面を表示することができます。

これにより、ユーザーは選択した項目の詳細情報を確認できます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.ItemActivate += ListView1_ItemActivate;
    }
    private void ListView1_ItemActivate(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            string selectedItem = listView1.SelectedItems[0].Text; // 選択された項目のテキストを取得
            DetailForm detailForm = new DetailForm(selectedItem); // 詳細画面を作成
            detailForm.ShowDialog(); // モーダルで表示
        }
    }
}

項目をダブルクリックすると、選択された項目の詳細情報を表示する新しいウィンドウが開きます。

列ヘッダークリックでデータを並べ替える

ColumnClickイベントを利用して、ListViewの列ヘッダーがクリックされたときにデータを並べ替える機能を実装できます。

これにより、ユーザーは表示されているデータを簡単に整理できます。

using System.Windows.Forms;
using System;
using System.Collections;

partial class MyForm : Form
{
	private bool ascending = true; // 昇順か降順かを管理
	ListView listView1 = new ListView();
	public MyForm()
	{
		InitializeComponent();
		listView1.View = View.Details;
		listView1.Columns.Add("Column1", 100);
		listView1.Columns.Add("Column2", 100);
		listView1.Columns.Add("Column3", 100);
		listView1.Items.Add(new ListViewItem(new string[] { "1", "2", "3" }));
		listView1.Items.Add(new ListViewItem(new string[] { "4", "5", "6" }));
		listView1.Items.Add(new ListViewItem(new string[] { "7", "8", "9" }));
		listView1.ColumnClick += ListView1_ColumnClick;
		Controls.Add(listView1);
	}
	private void ListView1_ColumnClick(object sender, ColumnClickEventArgs e)
	{
		listView1.ListViewItemSorter = new ListViewItemComparer(e.Column, ascending); // ソート用の比較クラスを設定
		ascending = !ascending; // ソート順を反転
		listView1.Sort(); // ソートを実行
	}
}
class ListViewItemComparer : IComparer
{
	private int col;
	private bool ascending;
	public ListViewItemComparer(int column, bool ascending)
	{
		col = column;
		this.ascending = ascending;
	}
	public int Compare(object x, object y)
	{
		int result = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
		return ascending ? result : -result; // 昇順または降順で返す
	}
}

列ヘッダーをクリックすると、その列のデータが昇順または降順に並べ替えられます。

コンテキストメニューを表示する

MouseClickイベントを利用して、ListView内で右クリックされたときにコンテキストメニューを表示することができます。

これにより、ユーザーは特定の項目に対して操作を実行できます。

partial class MyForm : Form
{
    private ContextMenuStrip contextMenu;
    public MyForm()
    {
        InitializeComponent();
        contextMenu = new ContextMenuStrip();
        contextMenu.Items.Add("削除", null, DeleteItem_Click); // メニュー項目を追加
        listView1.MouseClick += ListView1_MouseClick;
    }
    private void ListView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right) // 右クリックの場合
        {
            ListViewItem item = listView1.GetItemAt(e.X, e.Y); // クリックした位置の項目を取得
            if (item != null)
            {
                contextMenu.Show(listView1, e.Location); // コンテキストメニューを表示
            }
        }
    }
    private void DeleteItem_Click(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            listView1.Items.Remove(listView1.SelectedItems[0]); // 選択された項目を削除
        }
    }
}

ListView内で右クリックすると、削除オプションを含むコンテキストメニューが表示され、選択された項目を削除できます。

ドラッグアンドドロップの実装

ListViewにドラッグアンドドロップ機能を実装することで、ユーザーは項目を簡単に移動させることができます。

DragEnterイベントとDragDropイベントを利用して、ドラッグ操作を処理します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.AllowDrop = true; // ドロップを許可
        listView1.DragEnter += ListView1_DragEnter;
        listView1.DragDrop += ListView1_DragDrop;
    }
    private void ListView1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.Text)) // テキストデータが存在する場合
        {
            e.Effect = DragDropEffects.Move; // 移動の効果を設定
        }
    }
    private void ListView1_DragDrop(object sender, DragEventArgs e)
    {
        string data = (string)e.Data.GetData(DataFormats.Text); // ドロップされたデータを取得
        listView1.Items.Add(data); // 新しい項目を追加
    }
}

テキストデータをListViewにドラッグアンドドロップすると、新しい項目が追加されます。

ListViewイベントの応用例

ファイルエクスプローラーの実装

ListViewを使用して、ファイルエクスプローラーのようなインターフェースを作成することができます。

ユーザーがフォルダーを選択すると、そのフォルダー内のファイルやサブフォルダーをListViewに表示し、選択されたファイルの詳細情報を表示することが可能です。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.SelectedIndexChanged += ListView1_SelectedIndexChanged;
        LoadFiles("C:\\"); // 初期フォルダーを指定
    }
    private void LoadFiles(string path)
    {
        listView1.Items.Clear(); // 既存の項目をクリア
        string[] files = Directory.GetFiles(path); // 指定フォルダー内のファイルを取得
        foreach (string file in files)
        {
            listView1.Items.Add(Path.GetFileName(file)); // ファイル名をListViewに追加
        }
    }
    private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // 選択されたファイルの詳細情報を表示する処理
    }
}

指定したフォルダー内のファイルがListViewに表示され、選択されたファイルの詳細情報を表示することができます。

音楽プレイヤーのプレイリスト機能

ListViewを使用して、音楽プレイヤーのプレイリストを表示することができます。

ユーザーが曲を選択すると、その曲を再生する機能を実装できます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.ItemActivate += ListView1_ItemActivate;
        LoadPlaylist(); // プレイリストを読み込む
    }
    private void LoadPlaylist()
    {
        // プレイリストの曲をListViewに追加
        listView1.Items.Add("曲1.mp3");
        listView1.Items.Add("曲2.mp3");
        listView1.Items.Add("曲3.mp3");
    }
    private void ListView1_ItemActivate(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            string selectedSong = listView1.SelectedItems[0].Text; // 選択された曲のテキストを取得
            PlaySong(selectedSong); // 曲を再生する処理
        }
    }
    private void PlaySong(string song)
    {
        // 曲を再生する処理を実装
    }
}

プレイリストから曲をダブルクリックすると、その曲が再生されます。

タスク管理アプリのタスク一覧表示

ListViewを使用して、タスク管理アプリのタスク一覧を表示することができます。

ユーザーはタスクを追加、削除、完了にすることができ、タスクの状態を簡単に管理できます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.MouseClick += ListView1_MouseClick;
        LoadTasks(); // タスクを読み込む
    }
    private void LoadTasks()
    {
        // タスクをListViewに追加
        listView1.Items.Add("タスク1 - 未完了");
        listView1.Items.Add("タスク2 - 未完了");
    }
    private void ListView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right) // 右クリックの場合
        {
            // コンテキストメニューを表示してタスクを完了にする処理を実装
        }
    }
}

タスクを右クリックすると、タスクを完了にするオプションが表示され、選択されたタスクの状態を変更できます。

ショッピングカートのアイテム管理

ListViewを使用して、ショッピングカートのアイテムを表示し、ユーザーがアイテムを追加、削除できる機能を実装できます。

これにより、ユーザーはカート内のアイテムを簡単に管理できます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.MouseClick += ListView1_MouseClick;
        LoadCartItems(); // カート内のアイテムを読み込む
    }
    private void LoadCartItems()
    {
        // カート内のアイテムをListViewに追加
        listView1.Items.Add("アイテム1 - ¥1000");
        listView1.Items.Add("アイテム2 - ¥2000");
    }
    private void ListView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right) // 右クリックの場合
        {
            // コンテキストメニューを表示してアイテムを削除する処理を実装
        }
    }
}

ショッピングカート内のアイテムを右クリックすると、削除オプションが表示され、選択されたアイテムをカートから削除できます。

データベースレコードの一覧表示

ListViewを使用して、データベースから取得したレコードを表示することができます。

ユーザーはレコードを選択して詳細情報を確認したり、編集したりすることができます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        LoadRecords(); // データベースからレコードを読み込む
    }
    private void LoadRecords()
    {
        // データベースからレコードを取得し、ListViewに追加
        listView1.Items.Add("レコード1 - 情報1");
        listView1.Items.Add("レコード2 - 情報2");
    }
}

データベースから取得したレコードがListViewに表示され、ユーザーは選択したレコードの詳細情報を確認できます。

よくある質問

ListViewのイベントが発生しないのはなぜ?

ListViewのイベントが発生しない場合、以下の点を確認してください。

  • イベントハンドラーの登録: イベントハンドラーが正しく登録されているか確認します。

例えば、listView1.SelectedIndexChanged += ListView1_SelectedIndexChanged;のように、イベントに対してメソッドを正しく割り当てているか確認します。

  • ListViewのプロパティ: ListViewのプロパティが適切に設定されているか確認します。

例えば、Enabledプロパティがfalseになっていると、イベントは発生しません。

  • UIスレッド: UIスレッドで実行されているか確認します。

バックグラウンドスレッドでUI操作を行うと、イベントが発生しないことがあります。

ListViewのパフォーマンスを向上させる方法は?

ListViewのパフォーマンスを向上させるための方法は以下の通りです。

  • VirtualModeの使用: 大量のデータを表示する場合、VirtualModeを有効にして、必要なデータのみを表示するようにします。
  • DoubleBufferedの設定: ListViewのDoubleBufferedプロパティをtrueに設定することで、描画のちらつきを減らし、パフォーマンスを向上させることができます。
  • 非表示の項目の削除: 不要な項目をListViewから削除し、表示する項目数を減らすことで、描画速度を向上させます。
  • データのバッチ処理: 一度に複数の項目を追加または削除する場合、BeginUpdateEndUpdateメソッドを使用して、描画の更新を一時的に停止します。

ListViewのカスタム描画はどうやって行うの?

ListViewのカスタム描画を行うには、DrawItemDrawSubItemDrawColumnHeaderイベントを利用します。

これにより、項目やサブ項目、列ヘッダーの描画をカスタマイズできます。

以下はカスタム描画の基本的な手順です。

  1. OwnerDrawプロパティの設定: ListViewのOwnerDrawプロパティをtrueに設定します。
  2. イベントハンドラーの実装: DrawItemDrawSubItemDrawColumnHeaderイベントのハンドラーを実装し、描画のロジックを記述します。
  3. 描画の実行: 各イベント内で、Graphicsオブジェクトを使用して、カスタムな描画を行います。
partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        listView1.OwnerDraw = true; // OwnerDrawを有効にする
        listView1.DrawItem += ListView1_DrawItem; // DrawItemイベントを登録
    }
    private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        e.DrawDefault = false; // デフォルトの描画を無効にする
        // カスタム描画のロジックを記述
        e.Graphics.FillRectangle(Brushes.LightBlue, e.Bounds); // 背景を塗りつぶす
        e.Graphics.DrawString(e.Item.Text, e.Item.Font, Brushes.Black, e.Bounds); // テキストを描画
    }
}

このようにして、ListViewの項目をカスタマイズして描画することができます。

まとめ

この記事では、C#のListViewコントロールに関連するイベントの使い方や活用法、応用例について詳しく解説しました。

ListViewのイベントを活用することで、ユーザーインターフェースをよりインタラクティブにし、アプリケーションの機能を向上させることが可能です。

これを機に、実際のプロジェクトにListViewを取り入れ、さまざまな機能を実装してみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す