выбор нескольких строк элементов в ListView - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть вид дерева, который находится в подробном представлении.listview заполняется элементами и подпунктами, которые в паре из 4 строк связаны между собой.Я установил Name свойство каждой из строк в этих 4 элементах одинаково.

То, что я ищу, - это когда пользователь выбирает строку, выбираются все 4 строки, которые имеют схожие свойства имени (подсвечены)) автоматически.

То, что я сделал до сих пор, приведено ниже, но оно не компилируется!

private void resultSheet_SelectedIndexChanged(object sender, EventArgs e)
{
    string name = resultSheet.SelectedItems[0].Name.ToString();

    ListView.ListViewItemCollection items = new ListView.ListViewItemCollection(resultSheet);

    foreach (ListViewItem item in resultSheet.Items)
    {
        if (item.Name.ToString() == name) 
        {
            items.Add(item);
        }
    }

    resultSheet.SelectedItems = items; //Does not compile 

}

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

ListView.SelectedItems только для чтения.

if(resultSheet.SelectedItems.Count >= 1)
{
    string name = resultSheet.SelectedItems[0].Name.ToString();
    foreach (ListViewItem item in resultSheet.Items)
    {
        item.Selected = item.Name.ToString() == name; 
    }
}

Редактировать : в соответствии с вашим комментарием к другому ответу: убедитесь, что SelectedItems.Count >= 1 перед доступом кэлемент с индексом 0, потому что «Нет выбора» также возможное состояние.Когда вы выбираете другой элемент, ListView отменяет выбор SelectedItem перед выбором нового элемента

Если вы хотите избежать ненужных событий SelectedIndexChanged, попробуйте подход Роберта Timer-ListView или для этого приложения.Свободный подход (VB.NET, но его легко конвертировать), который используется ObjectListView под капотом для предотвращения запуска нескольких событий.

1 голос
/ 11 декабря 2011

Просто измените ваш метод следующим образом:

 bool inAction = false;

 private void resultSheet_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (inAction || (resultSheet.SelectedItems.Count == 0))
     {
         return;
     }
     inAction = true;
     string name = resultSheet.SelectedItems[0].Name;

     foreach (ListViewItem item in resultSheet.Items)
     {
         if (item.Name.ToString() == name)
         {
             item.Selected = true;
         }
     }
     inAction = false;
 } 

Редактировать: Или, если вы предпочитаете LINQ, сделайте это так:

 bool inAction = false;

 private void resultSheet_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (inAction || (resultSheet.SelectedItems.Count == 0))
     {
         return;
     }
     inAction = true;
     string name = resultSheet.SelectedItems[0].Name;

     foreach (ListViewItem item in resultSheet.Items.OfType<ListViewItem>().Where(item => item.Name == name))
     {
         item.Selected = true;
     }
     inAction = false;
 } 
...