首页 > 解决方案 > 具有 VirtualMode 的列表视图中的 SelectedItems.Count 异常

问题描述

从我的列表视图中选择一个值并单击我的按钮后,我想将我的值放入代码中,但我的代码抛出了这个异常:

Count = 'this.listView1.SelectedItems.Count' 引发了“System.InvalidOperationException”类型的异常

private void OK_button_Click(object sender, EventArgs e)
    {
      try
      {
        // OK -> Daten übernehmen
        ListView.SelectedListViewItemCollection data = this.listView1.SelectedItems;

        int iCount = data.Count;
        if (iCount != 1)
        {
          MessageBox.Show("Value is empty");
          return;
        }
        DialogResult = DialogResult.OK;
        Close();
      }
      catch (Exception ex)
      {
        //WriteProtokoll(ex.ToString(), 0);   
        Close();
      }
    }
  } 
 private void listView1_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
    {
      e.Index = Array.FindIndex(myData, s => s == textBox1.Text.ToString());
    }

    private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {

      e.Item = new ListViewItem(myData[e.ItemIndex]);
     
    }
    myData = new string[dataListSize];
      for (int i = 0; i < dataListSize; i++)
      {
        myData[i] = String.Format("{0}", i);
      }


 private void textBox1_TextChanged(object sender, EventArgs e)
    {

      String MyString = textBox1.Text.ToString();  

      ListViewItem lvi = listView1.FindItemWithText(MyString.TrimEnd());
      //Select the item found and scroll it into view.
      if (lvi != null)
      {
        listView1.SelectedIndices.Clear();
        listView1.SelectedIndices.Add(lvi.Index);
        listView1.EnsureVisible(lvi.Index);

      }
    }

标签: c#winformslistview

解决方案


这是您使用时的设计VirutalMode。该文档指出:

在虚拟模式下,Items 集合被禁用。尝试访问它会导致 InvalidOperationException。 CheckedItems 集合和SelectedItems 集合也是如此

我们可以在源代码中确认这一点。

它继续提供以下建议:

如果要检索选定或选中的项目,请改用 SelectedIndices 和 CheckedIndices 集合。

因此,您应该this.listView1.SelectedIndices.Count改用。

再次查看源代码,我们可以看到这不会抛出异常。


推荐阅读