DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ListViewのアイテムのテキストをユーザーが編集できるようにする

補足:TreeViewのノードのテキストをユーザーが編集できるようにする方法は、「TreeViewのノードのテキストをユーザーが編集できるようにする」に移動しました。

エクスプローラでファイル名を変更する時、そのファイルをゆっくり2回クリックするか、F2キーを押すことにより、新しいファイル名を入力できるようになります。ここではこれと同じことがListViewコントロールでできるようにする方法を紹介します。

ゆっくり2回クリックすることで、編集できるようにする

ListViewコントロールのLabelEditプロパティをTrueにすると、ユーザーがアイテムをゆっくり2回クリックすることにより、アイテムのテキスト(ラベル)を編集できるようになります。それ以外に特別なコードは必要ありません。

F2キーを押すことで、編集できるようにする

F2キーを押すことで編集できるようにするには、ListViewのKeyUpイベントハンドラでF2キーが押されたが調べ、押されていれば、ListViewItem.BeginEditメソッドを呼び出してアイテムのラベルの編集を開始します。

ListViewコントロールのLabelEditプロパティがTrueの時だけ、ListViewItem.BeginEditメソッドを使用できます。

編集の開始と終了を知る、編集をキャンセルする

ラベルの編集が始まる前にBeforeLabelEditイベントが、編集が終わった時にAfterLabelEditイベントが発生します。

それぞれのイベントハンドラで、LabelEditEventArgs.CancelEditプロパティをTrueにすることにより、編集をキャンセルすることができます。BeforeLabelEditイベントハンドラでキャンセルした時は、編集状態になりません。AfterLabelEditイベントハンドラでキャンセルした時は、編集されたラベルは破棄され、元に戻ります。

サンプル

次の例では、リストビューコントロール"ListView1"のアイテムのラベルをユーザーが編集できるようにしています。BeforeLabelEditイベントハンドラで、インデックスが0のアイテムは編集できないようにしています。また、AfterLabelEditイベントハンドラで、編集されたラベルが別のアイテムで使用されていないかを調べ、使用されていればキャンセルしています。

VB.NET
コードを隠すコードを選択
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
                       ByVal e As EventArgs) Handles MyBase.Load
    'アイテムをユーザーが編集できるようにする
    ListView1.LabelEdit = True

    'イベントハンドラの追加
    AddHandler ListView1.BeforeLabelEdit, AddressOf ListView1_BeforeLabelEdit
    AddHandler ListView1.AfterLabelEdit, AddressOf ListView1_AfterLabelEdit
    AddHandler ListView1.KeyUp, AddressOf ListView1_KeyUp
End Sub

'BeforeLabelEditイベントハンドラ
'アイテムのラベルの編集が開始された時
Private Sub ListView1_BeforeLabelEdit(ByVal sender As Object, _
                                      ByVal e As LabelEditEventArgs)
    'インデックスが0のアイテムは編集できないようにする
    If e.Item = 0 Then
        e.CancelEdit = True
    End If
End Sub

'AfterLabelEditイベントハンドラ
'アイテムのラベルの編集された時
Private Sub ListView1_AfterLabelEdit(ByVal sender As Object, _
                                     ByVal e As LabelEditEventArgs)
    'ラベルが変更されたか調べる
    'e.LabelがNothingならば、変更されていない
    If Not (e.Label Is Nothing) Then
        Dim lv As ListView = DirectCast(sender, ListView)
        '同名のアイテムがあるか調べる
        For Each lvi As ListViewItem In lv.Items
            '同名のアイテムがあるときは編集をキャンセルする
            If lvi.Index <> e.Item AndAlso lvi.Text = e.Label Then
                MessageBox.Show("同名のアイテムがすでにあります。")
                '編集をキャンセルして元に戻す
                e.CancelEdit = True
                Return
            End If
        Next
    End If
End Sub

'KeyUpイベントハンドラ
'ListView1でキーが離れた時
Private Sub ListView1_KeyUp(ByVal sender As Object, _
                            ByVal e As KeyEventArgs)
    Dim lv As ListView = DirectCast(sender, ListView)
    'F2キーが離されたときは、フォーカスのあるアイテムの編集を開始
    If e.KeyCode = Keys.F2 AndAlso _
        Not lv.FocusedItem Is Nothing AndAlso _
        lv.LabelEdit Then

        lv.FocusedItem.BeginEdit()
    End If
End Sub
C#
コードを隠すコードを選択
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
    //アイテムをユーザーが編集できるようにする
    ListView1.LabelEdit = true;

    //イベントハンドラの追加
    ListView1.BeforeLabelEdit += new LabelEditEventHandler(ListView1_BeforeLabelEdit);
    ListView1.AfterLabelEdit += new LabelEditEventHandler(ListView1_AfterLabelEdit);
    ListView1.KeyUp += new KeyEventHandler(ListView1_KeyUp);
}

//BeforeLabelEditイベントハンドラ
//アイテムのラベルの編集が開始された時
private void ListView1_BeforeLabelEdit(object sender, LabelEditEventArgs e)
{
    //インデックスが0のアイテムは編集できないようにする
    if (e.Item == 0)
    {
        e.CancelEdit = true;
    }
}

//AfterLabelEditイベントハンドラ
//アイテムのラベルの編集された時
private void ListView1_AfterLabelEdit(object sender, LabelEditEventArgs e)
{
    //ラベルが変更されたか調べる
    //e.Labelがnullならば、変更されていない
    if (e.Label != null)
    {
        ListView lv = (ListView)sender;
        //同名のアイテムがあるか調べる
        foreach (ListViewItem lvi in lv.Items)
        {
            //同名のアイテムがあるときは編集をキャンセルする
            if (lvi.Index != e.Item && lvi.Text == e.Label)
            {
                MessageBox.Show("同名のアイテムがすでにあります。");
                //編集をキャンセルして元に戻す
                e.CancelEdit = true;
                return;
            }
        }
    }
}

//KeyUpイベントハンドラ
//ListView1でキーが離れた時
private void ListView1_KeyUp(object sender, KeyEventArgs e)
{
    ListView lv = (ListView)sender;
    //F2キーが離されたときは、フォーカスのあるアイテムの編集を開始
    if (e.KeyCode == Keys.F2 && lv.FocusedItem != null && lv.LabelEdit)
    {
        lv.FocusedItem.BeginEdit();
    }
}
  • 履歴:
  • 2010/12/3 説明とサンプルを少し書き換える。TreeViewのノードのテキストをユーザーが編集できるようにする方法を別のページに移す。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。