none
VS2008 and C#: (ListView) どうしたらプログラムからListViewのあるエントリーを選択したことにできますか? RRS feed

  • 質問

  • 現在、VS2008/C#でフォームベースの開発をしています。どうしたらListViewのある項目をプログラムから「選択」できますか?

    listView.Items[index].Selected = true;   (選択されません)

    listView.Items[index].BackColor = Color.Navy; (ちゃんと色が変わります)

    よろしくお願いします。

    2010年9月19日 23:28

回答

  • こんな

    public class Form1 : Form
    {
      private ListView listView;
    
      public Form1()
      {
        listView = new ListView();
        listView.Dock = DockStyle.Fill;
        listView.MultiSelect=true;
    
        listView.HideSelection = false;
    
        for (int i = 1; i <= 100; i++)
        {
          listView.Items.Add(new ListViewItem(i.ToString()));
        }
        listView.SelectedIndices.Clear();
        listView.SelectedIndices.Add(44);
        listView.SelectedIndices.Add(66);
    
        this.Controls.Add(listView);
      }
    
      protected override void OnShown(EventArgs e)
      {
        base.OnShown(e);
    
        if (listView.SelectedItems.Count > 0)
        {
          listView.EnsureVisible(listView.SelectedIndices[0]); //選択項目が表示されるようにスクロール
          listView.FocusedItem = listView.SelectedItems[0]; //点線枠を移動
          listView.Focus(); //フォームが表示されてからフォーカスを与える
        }
    
        //選択されている項目を表示する。
        //ただしこれをやるとMessageBoxにフォーカスがあるので
        //選択項目は淡色表示になる。
        StringBuilder sb = new StringBuilder();
        foreach (ListViewItem item in listView.SelectedItems)
        {
          sb.AppendLine(item.Text);
        }
        MessageBox.Show(sb.ToString());
      }
    }
    

    HideSelection=falseにしていても、通常はフォーカスのある状態では青色で、フォーカスが無い状態では淡色表示になります。

    • 回答としてマーク 山本春海 2010年9月27日 8:46
    2010年9月20日 4:01

すべての返信

  • ListViewのHideSelectionをfalseにしていない状態で、フォーカスが外れているということはないですか?
    2010年9月19日 23:55
  • gekka様、

    「フォーカスが外れているということはないですか?」ですが、まさにそのListViewが含まれたフォームが立ち上がってきたときに、ある項目を「選択」したいのが私の希望です。マウスでのクリッではなくて、という意味です。ですので、その段階では、どこにもフォーカスが行っていないと思います。これで答えになっていますか?

    よろしくお願いします。

    2010年9月20日 0:22
  • 今調べましたが、

    ListViewのHideSelection は true になっています。

    2010年9月20日 0:24
  • gekka さんのアドバイス通りだと思います。まずは読みましょう。

      ListView.HideSelection プロパティ (System.Windows.Forms)
      http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview.hideselection.aspx
    2010年9月20日 0:51
  • ListView以外のどこか他のコントロールがアクティブになっていませんか?
    listView.Items[index].Selected = true;
    の後に、
    listView.Select();
    を実行してみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月20日 0:57
    モデレータ
  • 再度下記のコードで試しましたが、何も選択されていないようです。このコードでは4番目の項目を「選択された」状態(クリックされた状態と同じ)にすることが目的です。

    ListViewのHideSelection は false です。

    listView.Focus();
    listView.Items[3].Selected = true; 

    ListView.SelectedListViewItemCollection name = this.listView.SelectedItems;

    foreach (ListViewItem item in name)
    {
         iListViewItemSelectedIndex = item.Index;
         MessageBox.Show(iListViewItemSelectedIndex.ToString());
    }

    これを実行すると、4番目の項目は「グレーアウト」の状態になりますが、選択された「ブルー」ではありません。そして、MessageBox.Show() は何も打ち出しません。どこが不備なのでしょうか?

    よろしくお願いします。

    2010年9月20日 3:02
  • 回答者のみなさんのレスをちゃんと読んでないのでは?

    Focus でなくて Select にしたらどうなりますか?

    2010年9月20日 3:58
  • こんな

    public class Form1 : Form
    {
      private ListView listView;
    
      public Form1()
      {
        listView = new ListView();
        listView.Dock = DockStyle.Fill;
        listView.MultiSelect=true;
    
        listView.HideSelection = false;
    
        for (int i = 1; i <= 100; i++)
        {
          listView.Items.Add(new ListViewItem(i.ToString()));
        }
        listView.SelectedIndices.Clear();
        listView.SelectedIndices.Add(44);
        listView.SelectedIndices.Add(66);
    
        this.Controls.Add(listView);
      }
    
      protected override void OnShown(EventArgs e)
      {
        base.OnShown(e);
    
        if (listView.SelectedItems.Count > 0)
        {
          listView.EnsureVisible(listView.SelectedIndices[0]); //選択項目が表示されるようにスクロール
          listView.FocusedItem = listView.SelectedItems[0]; //点線枠を移動
          listView.Focus(); //フォームが表示されてからフォーカスを与える
        }
    
        //選択されている項目を表示する。
        //ただしこれをやるとMessageBoxにフォーカスがあるので
        //選択項目は淡色表示になる。
        StringBuilder sb = new StringBuilder();
        foreach (ListViewItem item in listView.SelectedItems)
        {
          sb.AppendLine(item.Text);
        }
        MessageBox.Show(sb.ToString());
      }
    }
    

    HideSelection=falseにしていても、通常はフォーカスのある状態では青色で、フォーカスが無い状態では淡色表示になります。

    • 回答としてマーク 山本春海 2010年9月27日 8:46
    2010年9月20日 4:01
  • こんなさん、

    大変具体的なコードをありがとうございました。単独で動くことを確認しましたので、これを参考に私のほうのコードを修正します。

    ありがとうございました。

    2010年9月20日 11:21
  • SuferOnWwwさん、

    残念ながら状態は変わらないようです。「こんな」さんに具体的なサンプルコードコードを示していただきました。これを参考にコードの修正をしたいと思います。

    ありがとうございました。

    2010年9月20日 11:24
  • > 残念ながら状態は変わらないようです。

    いや、そんなことはないはずです。たぶん、やり方の問題だと思います。
    trapemiya  さんが書かれたやり方で間違いないはずです。

    一応コードを書いて、間違いないことを検証済みです。

    2010年9月20日 12:45
  • SurferOnWwwさん、

    再度私のほうのコードを見直します、

    ありがとうございました。

    2010年9月21日 3:51