6月 14

項目を右クリックでも選択できるようにする

ListBoxで、項目を右クリックでも選択できるようにするには
自分でマウスイベントを捕捉して
マウスポインター位置より選択すべきアイテムのインデックスを取得し
そのアイテムを選択させます。
他にも方法はあると思いますが参考程度に

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 適当に項目を追加
            for(int i = 0; i < 100; i++)
            {
                listBox1.Items.Add(i.ToString());
            }

            // マウスボタンが離されたイベント取得
            listBox1.MouseUp += new MouseEventHandler(listBox1_MouseUp);
        }

        void listBox1_MouseUp(object sender, MouseEventArgs e)
        {
            // 右クリックされた?
            if(e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                // マウス座標から選択すべきアイテムのインデックスを取得
                int index = listBox1.IndexFromPoint(e.Location);

                // インデックスが取得できたら
                if(index >= 0)
                {
                    // すべての選択状態を解除してから
                    listBox1.ClearSelected();

                    // アイテムを選択
                    listBox1.SelectedIndex = index;
                }
            }
        }
    }
}

なお、コンテキストメニューを割り当てている場合は
マウスクリックのイベントそのものが発生しなかったりしますが
その場合も
自分でコンテキストメニューをハンドラ内で表示させるなどしてください。

    // インデックスが取得できたら
    if(index >= 0)
    {
        // すべての選択状態を解除してから
        listBox1.ClearSelected();

        // アイテムを選択
        listBox1.SelectedIndex = index;

        // コンテキストメニューを表示
        Point pos = listBox1.PointToScreen(e.Location);
        contextMenuStrip1.Show(pos);
    }
6月 14

項目を選択する

ListBoxの項目をプログラムで選択する例です。

        private void button1_Click(object sender, EventArgs e)
        {
            // すべての項目の選択を解除
            listBox1.ClearSelected();

            // インデックス0番の項目を選択
            listBox1.SetSelected(0, true);
            listBox1.SelectedIndex = 0;     // こちらでもOK

            // Textプロパティに値を指定する方法もあります
            listBox1.Text = "苺";
            listBox1.SelectedItem = "苺";   // こちらでもOK

            // 複数の項目を選択する場合
            for (int index = 0; index < 3; index++)
                listBox1.SetSelected(index, true);
        }
6月 14

選択方法を変更する(単一選択、複数選択など)

ListBoxはデフォルトで単一選択ですが
SelectionModeプロパティの値を変更し
選択方法を変更することができます。

SelectionModeプロパティに設定できる値には次のものがあります。

    SelectionMode.One              一選択(デフォルトです)
    SelectionMode.MultiSimple       複数選択
    SelectionMode.MultiExtended     複数選択(CTRLやShiftキーでの選択も可能)
    SelectionMode.None              選択不可

複数選択の場合の
選択されている項目を取得する例は次のようになります。

        private void button1_Click(object sender, EventArgs e)
        {
            // 選択されているすべての項目の文字列を表示
            foreach (string item in listBox1.SelectedItems)
                Console.WriteLine(item);

            // 選択されているすべての項目のインデックスを表示
            foreach (int index in listBox1.SelectedIndices)
                Console.WriteLine(index);
        }
6月 14

選択されている項目を取得する

ListBoxで選択している項目を取得するには
SelectedIndexプロパティを参照します。

選択している項目を設定する場合も同様に
SelectedIndexプロパティに選択したい項目のインデックスを指定します。

下記はFormにListBoxを1つ、Buttonを1つ配置し
Buttonをクリックすると
選択している項目の文字列を表示するサンプルです。

        private void button1_Click(object sender, EventArgs e)
        {
            // 選択されている項目のインデックスを取得
            int index = listBox1.SelectedIndex;

            // 選択されていればインデックスに0以上の値が入ります
            if (index >= 0)
            {
                // 選択されている項目を表示(Itemsはobjectなのでキャストしています)
                string item = (string)listBox1.Items[index];
                MessageBox.Show(item);
            }

            // またはSelectedItemプロパティを参照します。
            // 何も選択されていなければnullが入っています
            MessageBox.Show((string)listBox1.SelectedItem);
        }
6月 14

項目を追加、削除、検索

ListBoxの項目はItemsコレクションに保存されています。
項目が固定であれば、デザイン時にItemsプロパティーに
改行区切りで入力しておけばOKです。

以下はFormにListBoxを1つ配置して
起動時のLoadイベント内で項目に対する各処理を行っています。

        private void Form1_Load(object sender, EventArgs e)
        {
            // すべての項目を削除
            listBox1.Items.Clear();

            // 項目を1つずつ追加
            listBox1.Items.Add("りんご");
            listBox1.Items.Add("みかん");

            // 項目を複数まとめて追加(こちらが高速)
            string[] items = {"スイカ", "メロン", "苺"};
            listBox1.Items.AddRange(items);

            // 項目を指定して削除
            listBox1.Items.Remove("みかん");

            // IndexOfで項目のインデックスを取得
            // RemoveAtでインデックスを指定して削除
            listBox1.Items.RemoveAt(listBox1.Items.IndexOf("りんご"));
        }

■結果

listbox_item