• ベストアンサー

ListView 項目の選択/選択解除について

 ListViewに表示する情報が1件しかないとき、その情報が常に選択された状態なので、 困っています。  1件しかなくても、選択したり、選択を解除したりすることは出来ないのでしょうか?  または、ListViewでは出来ないけど、他のコントロールなら出来ると言う情報があり ましたらぜひ教えてください。  よろしくお願いします。

noname#5252
noname#5252

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

失礼しました × HitItem ○ HitTest でした。 Private Sub Form_Load()   Dim i    As Integer      With Me.ListView1     .View = lvwList       '//表示形式:一覧     .HideSelection = False   '//リストビューがフォーカスを失っても、選択状態を保持する     .MultiSelect = True     '//複数選択可能          'ダミーデータの登録     .ColumnHeaders.Add , , "ヘッダ"     For i = 1 To 10       Me.ListView1.ListItems.Add , , "Dmy Data" & i     Next i     End With End Sub Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)   Dim itmX  As ListItem      With Me.ListView1     'マウス位置のアイテムを取得     Set itmX = .HitTest(x, y)     '取得できたなら未処理     If Not (itmX Is Nothing) Then       GoTo PGMEND     End If          '現在選択中のアイテムを取得     Set itmX = .SelectedItem     '取得できなかったなら未処理     If (itmX Is Nothing) Then       GoTo PGMEND     End If          '選択解除     Set .SelectedItem = Nothing     itmX.Selected = False   End With    PGMEND:   Set itmX = Nothing End Sub

noname#5252
質問者

お礼

完璧です! どうもありがとうございました。 助かりました。

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

以前にエクスプローラのイベントを取得したいと思って、様々なメーリングリストを調べた経験があります。 explorer.exeの話題が出たので、ついでに勝手に補足しますw >explorer.exe の右ペインのリスト これは、エクスプローラ用のリストビューです。 構造はVBのリストビューと全く同じです。 サンプルで書いた .HideSelection = False 属性を持っています。 さらにマウスダウン時に、C言語で言うHitItemマクロで、アイテムの上でのクリックかどうかを調査して、わたしのサンプルと同様なことを行っております。

noname#5252
質問者

お礼

ご回答ありがとうございました。 教えて頂いたサンプル通りにやってみました。 その上で、やはりエクスプローラーのような選択/選択解除が一番使い易いかな と思い、HitItemについて調べているのですが、全然検索に引っかかりません。 他に何かキーワードがありましたら教えてください。 よろしくお願いします。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

その ListView のことは、知らないんですが、 普通(explorer.exe の右ペインのリストなど)は、 アイテムじゃないところ(余白)をクリックすると、 選択解除できます。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

Private Sub Command1_Click()   Dim itmX  As ListItem   With Me.ListView1     Set itmX = .SelectedItem     If itmX Is Nothing Then       Set .SelectedItem = Me.ListView1.ListItems(1)     Else       Set .SelectedItem = Nothing       itmX.Selected = False     End If   End With      Set itmX = Nothing End Sub Private Sub Form_Load()   Dim i    As Integer        With Me.ListView1     .View = lvwReport     .HideSelection = False          .ColumnHeaders.Add , , "ヘッダ"     For i = 1 To 10       Me.ListView1.ListItems.Add , , "Dmy Data" & i     Next i      End With End Sub

関連するQ&A

  • ListViewの選択、選択解除を行いたい

    VB6.0にて開発をしています。 ListViewで複数選択を可能とし、 Ctrl+クリックで選択、選択解除をせずに、クリックのみで選択、選択解除を行いたいです。 その際、複数選択されている場合はクリックした行のみが選択・選択解除される状態にしたいです。 CheckBoxesプロパティで行う方法は見つけられたのですが、 checkboxesプロパティが使用できないため困っています。 なにか方法がありますでしょうか?

  • ListViewの複数選択について

    こんにちは。 VBAでListViewを使い、DBの情報を出力しているのですが、ListViewに出力すると、必ず、1行目が選択されています。その選択自体はいいのですが、選択されているところに色付けがされていないのです。他のところを選択すると色がちゃんと付きます。どうすれば、最初の選択行に色をつけることが出来るのか教えてください。 それから、ListViewで複数件選択された場合のIndexの取り方を教えてください。今は以下のようにして1件だけは取得できています。 s = Userform2.ListView1.SelectedItem.Index 初心者なので、なるべく詳しくお願いします。

  • ListViewで1つを選択して詳細表示するには

    会社でいきなりVisual Studio 2008 を使い始めた者です。 Webサイトを作成しようとしており、慣れないながら悪戦苦闘しています。 GridViewコントロールのGridViewタスクには「選択を有効にする」のチェックがあり、それにより一覧表示された中から1つを選んでDetailViewで詳細表示、という流れが出来ることは、テストWebサイトを作成して確認しました。 しかし一方、ListViewコントロールのタスクには「選択を有効にする」のチェックがなく困っています。 (「ページングを有効にする」なら、GridViewにもListViewにもあるのに。残念) ListViewから詳細表示に持っていく流れにしてみたいのですが、どうすればいいのでしょうか。 希望としては、ListViewで一覧表示、そこから1つのみ選択してDetailViewで詳細表示、ができればいいなと思っています。が、それ以外でも良い方法があれば教えてもらえれば幸いです。

  • ListViewの選択について

    VB6.0を使用しています。 ListViewでlvwReport表示形式でFullRowSelectプロパディで行全体を選択するようにしてあるのですが、一部のカラムが選択されないように見えるのです。 例えば、5カラムあるListViewで、1,2,4,5カラムは選択されているのに、3カラム目だけ選択されてません。選択されない原因かどうかわからないのですが、選択されないように見えるカラムは必ず空白となっています。しかし、他のカラムでも空白の行は存在するのにちゃんと選択されていることもあります。 このような現象をご存知の方がいらしゃいましたら、教えていただけないでしょうか?よろしくお願いいたします。

  • ListViewについて

    いつもお世話になっています。 タイトルの通り、ListViewについて2つ質問があります。 (1)ListViewにDBから検索したデータを代入してますが、動きが遅いんです。  各項目ごとで色を変更したりするためだと思いますが、ListViewの表示を速くする方法はなにかありませんか?  ちなみに今は、ListViewを2枚使って、データをセットしている間は、VisibleをFalseにして、  データセットが完了した時点で、Trueに切り替えています。 (2)(1)の動きで、ListViewを使っているところ、今表示されているListView(Iとします)で  クリックしたデータを次に表示させるListView(IIとします)に引き継がせたいです。  Iで、選択している行をIIで選択状態にすることはできたのですが、  Iで選択している行がスクロールして下にあった場合、IIでもスクロールした場所に  ListViewを移動させたいのですが、その方法が分かりません。 何かご存知の方がいましたら、教えてください。 よろしくお願いいたします。

  • ListViewの項目を入れ替える

    C++で詳細表示のリストビューを扱うプログラムを書いているのですが あるボタンを押すと選択した項目が上や下に移動するようにしたいんです そのためには選択した項目とその上下の項目を入れ替えたらいいと思うのですが やり方がわかりません ListView_SortItemsマクロを使ってみましたが、ある二つの項目だけを入れ替えるのは できなさそうです。 MFCを使わない方法があればうれしいです

  • ExcelにてListviewが表示できない

    Excelにて「Microsoft Listview Control 6.0」を使っていたのですが、 突然、表示できない状況になりました。 修復させる方法はあるのでしょうか? また、最悪の場合、普通のListで作成し直したいのですが、 その際に、Listview他のコントロールを再利用したいので、 Listviewをフォームを表示させないで削除する方法はあるのでしょうか? それとも、他のコントロールも作り直すしかないのでしょうか? よろしく、お願いいたします。

  • ListViewの行選択について

    ListViewを使っているのですが、チェックボックスのチェックを付けた行全体を選択状態にし(選択状態は1行ずつ)、行をクリックしただけでは選択状態にしたくないのです。 どうすればいいでしょうか?

  • ExcelVBAでListViewが使用できない

    ノートパソコン(Windows7 64bit、EXCEL 64bit)を使用して、VBAでツールを作成しています。 フォーム上にListViewを追加したいのですが、コントロールの追加ダイアログにて 「Microsoft ListView Control, version 6.0」がリストがないので追加することができません。 参照設定にも「Microsoft Windows Common Controls 6.0(SP6)」がありませんでした。 これが原因かと考え、System32に「MSCOMCTL.OCX」がなかったので、 ListViewの使える他のパソコン(Windows7 32bit、EXCEL2010 32bit)から 「MSCOMCTL.OCX」を持ってきて入れました。 すると参照設定で「Microsoft Windows Common Controls 6.0(SP6)」を選べるようになったのですが、 未だにコントロールの追加ダイアログ上ではListViewの利用ができない状態でした。 職場のほとんどパソコンではListViewが使用可能なのですが、 ListViewが使用できないパソコンの条件などあるのでしょうか? ご回答お待ちしておりますのでよろしくお願い致します

  • ListViewの複数項目削除で再度質問です

    ArrayListのソートの件とListViewのおかしな挙動は解決できたのですが 最初に質問して解決したはずの削除の部分で再び分からなくなって しまったので質問させて頂きます。 今回は本体に今までのコードを正式に組み込んで、動作の確認を 行っていたのですが、複数件(連続や個別選択)のデータ削除を 行おうとしたら意図しないデータ(未整列状態の並びのデータ)が 削除されてしまうという事態が発生してしまいました。 これはどうすれば解決できるのでしょうか? また複数件の未読既読を制御(選択された項目に対してフラグを 入れ替える)するのも同様の方法で出来るのでしょうか? 環境はVS2005(C#)、.NET Framework2.0です。 以下に問題の削除時のコードを載せます。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[RECEIVE][sel_index]); collectionMail[RECEIVE].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ // 送信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[SEND][sel_index]); collectionMail[SEND].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "差出人または宛先"){ // 削除メールのとき if(MessageBox.Show("選択されたメールは完全に削除されます。\nよろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK){ for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].RemoveAt(sel_index); } } this.textBody.Text = ""; } } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); // 選択している位置がリストの件数よりも少ないとき if(currentRow < listView1.Items.Count){ // 選択していた位置-1の行にフォーカスを当て直す listView1.Items[currentRow - 1].Selected = true; listView1.Items[currentRow - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } else{ // リストの件数が1以上の時 if(listView1.Items.Count > 0){ // ListViewの行数位置-1の行にフォーカスを当て直す listView1.Items[listView1.Items.Count - 1].Selected = true; listView1.Items[listView1.Items.Count - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } } }

専門家に質問してみよう