ListView Item 選択

ListView から Item を選択して MessageBox に表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. Column を設定した ListView から Item を選択して MessageBox に表示します。
    ListView の Column 設定は ListView に Column を設定する を参照して下さい。
  2. InitializeComponent() メソッドの ListView に SelectedIndexChanged を設定します。
            // listView1
                ・・・
            this.listView1.View = System.Windows.Forms.View.List;
            this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
                ・・・
        
  3. Item を選択すると listView1_SelectedIndexChanged() が呼ばれます。
    SelectedItems[0] の [0] は選択された先頭 Item の Index です。
    itemx.Text(リンゴ)とitemx.SubItems[1].Text(果物)とitemx.SubItems[2].Text(赤) を編集して表示します。
        private void listView1_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            string msg = "選択された項目\n\n";
            if (listView1.SelectedItems.Count==0)   return;
            ListViewItem  itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            msg += itemx.Text + "\n";
            msg += itemx.SubItems[1].Text + "\n";
            msg += itemx.SubItems[2].Text;
            MessageBox.Show(msg);
        }
        
  4. CLI の環境で実行可能な完成したプログラムです。
    /******************************************/
    /*★ ListView の Item を選択    前田 稔 ★*/
    /******************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        private ListView listView1;
    
        public MyForm()
        {
            InitializeComponent();
            InitializeListView();
            Load += new System.EventHandler(MyForm_Load);
        }
    
        private void InitializeComponent()
        {
            this.listView1 = new System.Windows.Forms.ListView();
            this.SuspendLayout();
            // 
            // listView1
            // 
            this.listView1.Location = new System.Drawing.Point(12, 12);
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(258, 232);
            //this.listView1.Sorting = System.Windows.Forms.SortOrder.Descending;
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.View = System.Windows.Forms.View.List;
            this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
            // 
            // MyForm
            // 
            this.ClientSize = new System.Drawing.Size(282, 256);
            this.Controls.Add(this.listView1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
        }
    
        // ListViewコントロールを初期化します。
        private void InitializeListView()
        {
            // ListViewコントロールのプロパティを設定
            listView1.FullRowSelect = true;
            listView1.GridLines = true;
            listView1.Sorting = SortOrder.Ascending;
            listView1.View = View.Details;
    
            // 列(コラム)ヘッダの作成
            ColumnHeader[] columnHead = new ColumnHeader[3];
            for (int i = 0; i < 3; i++)
                columnHead[i] = new ColumnHeader();
            columnHead[0].Text = "名前";
            columnHead[0].Width = 100;
            columnHead[1].Text = "種類";
            columnHead[1].Width = 60;
            columnHead[2].Text = "データ";
            columnHead[2].Width = 80;
            listView1.Columns.AddRange(columnHead);
        }
    
        // ListViewコントロールのデータを更新します。
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            // ListViewコントロールにデータを追加します。
            string[] item1 = { "リンゴ", "果物", "赤"};
            listView1.Items.Add(new ListViewItem(item1));
            string[] item2 = { "メロン", "果物", "緑" };
            listView1.Items.Add(new ListViewItem(item2));
            string[] item3 = { "ピーマン", "野菜", "緑"};
            listView1.Items.Add(new ListViewItem(item3));
            string[] item4 = { "大根", "野菜", "白"};
            listView1.Items.Add(new ListViewItem(item4));
            string[] item5 = { "人参", "野菜", "赤" };
            listView1.Items.Add(new ListViewItem(item5));
        }
    
        private void listView1_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            string msg = "選択された項目\n\n";
            if (listView1.SelectedItems.Count==0)   return;
            ListViewItem  itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            msg += itemx.Text + "\n";
            msg += itemx.SubItems[1].Text + "\n";
            msg += itemx.SubItems[2].Text;
            MessageBox.Show(msg);
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    

Double Click

  1. ListView Item の Double Click を検出します。
    プログラムは先の Item 選択と同じ要領です。
  2. InitializeComponent() メソッドの ListView に DoubleClick を設定します。
    SelectedIndexChanged は外して下さい。
    これが設定されていると、ダブルクリックする前に SelectedIndexChanged が呼ばれます。
            // listView1
                ・・・
            this.listView1.View = System.Windows.Forms.View.List;
            //this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
            this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick);
                ・・・
        
  3. Item がダブルクリックされると listView1_DoubleClick() が呼ばれます。
    SelectedItems[0] の [0] は選択された先頭 Item の Index です。
    MessageBox で itemx.Text とメッセージを表示します。
        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            ListViewItem itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            MessageBox.Show(itemx.Text, "Double Click");
        }
        

Single & Double Click

  1. ListView Item の Single Click と Double Click の両方を検出します。
    両方検出するときは MouseDown を使います。
    MouseDown で e.Clicks を調べると、一度目は 1 が、二度目は 2 が設定されています。
    これを利用して e.Clicks==1 のときにタイマーを設定して、一定時間後に割り込みが入らなければ Single と判定します。
    Double Click の検出は e.Clicks==2 で処理するのが良いでしょう。
  2. 主要なソースコードです。
    InitializeComponent() でタイマーを準備します。
    ListView に MouseDown の検出を設定します。
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.timer1 = new System.Windows.Forms.Timer(this.components);
            this.timer1.Interval = 400;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            this.listView1.MouseDown += 
                new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDown);
    
    MouseDown では e.Clicks==1 のときタイマーを起動します。
    e.Clicks==2 のときは、直ちにタイマーを停止して Double Click の処理をします。
        private void listView1_MouseDown(object sender, MouseEventArgs e)
        {
            Console.WriteLine("MouseDown " + e.Clicks);
            if (e.Clicks==1)
            {   timer1.Start();     //400 ms
            }
            if (e.Clicks==2)        //Double Click
            {   timer1.Stop();
                ListViewItem itemx = new ListViewItem();
                itemx = listView1.SelectedItems[0];
            Console.WriteLine("Double Click " + itemx.Text);
            }
        }
    
    タイマー割り込みが発生したときは、Single Click です。
        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Stop();
            string msg = "single Click\n";
            if (listView1.SelectedItems.Count==0)   return;
            ListViewItem  itemx = new ListViewItem();
            itemx = listView1.SelectedItems[0];
            msg += itemx.Text + "\n";
            msg += itemx.SubItems[1].Text + "\n";
            msg += itemx.SubItems[2].Text;
            Console.WriteLine(msg);
            Console.WriteLine("--------");
        }
    
  3. プログラムの実行結果です。
    MouseDown 1 の後に割り込みが発生すれば Single Click です。
    MouseDown 1 に続いて MouseDown 2 が起これば Double Click です。
    Windows(C++) ではシステムが面倒をみてくれたような気がするのですが。 (;_;)
    もっと良い方法をご存じの方はメールして下さい。
    MouseDown 1
    single Click
    ピーマン
    野菜
    緑
    --------
    MouseDown 1
    single Click
    メロン
    果物
    緑
    --------
    MouseDown 1
    MouseDown 2
    Double Click リンゴ
    MouseDown 1
    MouseDown 2
    Double Click 人参
    

Multi Select

  1. ListView から複数の Item を選択して、マウスの右クリックで表示します。
    複数の項目を選択するには、ユーザーは Ctrl キーを押したまま選択する項目をクリックします。
    選択する最初の項目をクリックしてから、Shift キーを押したまま選択する最後の項目をクリックすると、連続する項目を選択できます。
  2. InitializeComponent() メソッドの ListView に MouseDown を設定します。
    左クリックも右クリックも MouseDown を使います。
            this.listView1.MouseDown += 
                new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDown);
        
  3. マウスがクリックされると listView1_MouseDown が呼ばれます。
    右クリックのとき、選択された Item を取得して印字します。
        // マウスがクリックされたとき
        private void listView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button==System.Windows.Forms.MouseButtons.Right)
            {   Console.WriteLine("Mouse Right Click");
                for (int i = 0; i < listView1.SelectedItems.Count; i++)
                {   Console.WriteLine(" {0}", listView1.SelectedItems[i]);
                }
            }
        }
        
  4. listView1.SelectedItems を使うと選択された Item が、SelectedIndices を使うと選択された Index が取得できます。
    Index 番号の印字は次のようになります。
        for (int i = 0; i < ListBox1.SelectedItems.Count; i++)
        {   Console.WriteLine(" {0}", ListBox1.SelectedItems[i]);  }
        

超初心者のプログラム入門(C# Frame Work)