補足:TreeViewのノードのテキストをユーザーが編集できるようにする方法は、「TreeViewのノードのテキストをユーザーが編集できるようにする」に移動しました。
エクスプローラでファイル名を変更する時、そのファイルをゆっくり2回クリックするか、F2キーを押すことにより、新しいファイル名を入力できるようになります。ここではこれと同じことがListViewコントロールでできるようにする方法を紹介します。
ListViewコントロールのLabelEditプロパティをTrueにすると、ユーザーがアイテムをゆっくり2回クリックすることにより、アイテムのテキスト(ラベル)を編集できるようになります。それ以外に特別なコードは必要ありません。
F2キーを押すことで編集できるようにするには、ListViewのKeyUpイベントハンドラでF2キーが押されたが調べ、押されていれば、ListViewItem.BeginEditメソッドを呼び出してアイテムのラベルの編集を開始します。
ListViewコントロールのLabelEditプロパティがTrueの時だけ、ListViewItem.BeginEditメソッドを使用できます。
ラベルの編集が始まる前にBeforeLabelEditイベントが、編集が終わった時にAfterLabelEditイベントが発生します。
それぞれのイベントハンドラで、LabelEditEventArgs.CancelEditプロパティをTrueにすることにより、編集をキャンセルすることができます。BeforeLabelEditイベントハンドラでキャンセルした時は、編集状態になりません。AfterLabelEditイベントハンドラでキャンセルした時は、編集されたラベルは破棄され、元に戻ります。
次の例では、リストビューコントロール"ListView1"のアイテムのラベルをユーザーが編集できるようにしています。BeforeLabelEditイベントハンドラで、インデックスが0のアイテムは編集できないようにしています。また、AfterLabelEditイベントハンドラで、編集されたラベルが別のアイテムで使用されていないかを調べ、使用されていればキャンセルしています。
'フォームの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
//フォームの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(); } }