0

我在 ListViews 上苦苦挣扎了一段时间...我正在编写一个无法复制到这里的程序(它有 637 行长)...基本上我正在尝试删除 ListView 的选定行...但是如果ListView 足够大,可以显示一个滚动条,它追逐程序说“没有为对象的实例设置对象引用”,它实际上并没有完全崩溃,但它显示了一个丑陋的 JIT 调试窗口。我知道问题出在 ListView 的大小上,因为如果我只是尝试使用活动滚动条删除 ListView 的任何项目,我就会崩溃,但是如果我只是将窗口的大小调整到足够大以禁用滚动条(即足够大,所以一切都适合,滚动条不是必需的,因此系统不会制作滚动条),一切正常!

(我已经尝试过各种代码来删除选定的项目,每个代码都有同样的错误,但我通过将所有 ListView 复制到一个数组,删除数组中的选定项目,然后复制它们使其工作回到一个干净的 ListView ......奇怪,凌乱,丑陋,我知道,但它是唯一有效的代码......但现在我得到了同样的错误,但只有在安装程序之后,当我没有发生这种情况时在 Visual Studio 中运行程序!)

编辑:删除代码是(注释部分是我之前尝试过的所有代码,但在同一个错误中失败了......这个只在安装时崩溃,而不是在 Visual Studio 2010 中......框架是 .NET 4.0):

private void limparLinhasSelecionadas() 
        {
            if (listView1.Items.Count > 0 && limpando == false)
            {
                limpando = true;
                int i = 0; 

                //for (i = listView1.Items.Count - 1; i >= 0 ; i--)
                //{
                    //if (listView1.Items[i].Selected == true)
                    //{
                    //    listView1.Items[i].Remove();                       
                    //}

                //}              
                //////for (i = listView1.SelectedIndices.Count - 1; i >= 0; i--)
                //////{
                //////    listView1.Items[listView1.SelectedIndices[i]].Remove();
                //////}
                //foreach (ListViewItem item in listView1.SelectedItems)
                //{
                //    listView1.Items.Remove(item);
                //}

                ArrayList itens = new ArrayList();

                foreach (ListViewItem item in listView1.Items)
                {
                    itens.Add(item);
                }

                foreach (ListViewItem item in listView1.SelectedItems)
                {
                    itens.Remove(item);                    
                }

                listView1.Items.Clear();

                foreach (ListViewItem item in itens)
                {
                    listView1.Items.Add((ListViewItem)item.Clone());
                }

                //for (i = 0; i < itens.Count; i ++)
                //{                    
                //    ListViewItem item = new ListViewItem((itens[i] as ListViewItem).Text);

                //    for (j = 1; j < (itens[i] as ListViewItem).SubItems.Count; j++)
                //    {
                //        item.SubItems.Add((itens[i] as ListViewItem).SubItems[j].Text);                     
                //    }
                //    listView1.Items.Add(item);
                //}

                for (i = 0; i < listView1.Items.Count; i++)
                {
                    listView1.Items[i].Text = "Passe " + (i + 1).ToString();
                }

                ////ListView listView = new ListView();

                ////int j = 0;

                ////for (i = 0; i < listView1.Items.Count; i++)
                ////{
                ////    //listView.Items.Add(listView1.Items[i]);
                ////    for (j = 0; j < listView1.Items[i].SubItems.Count; j++)
                ////    {
                ////        listView.Items[i].SubItems.Add(listView1.Items[i].SubItems[j].Text);
                ////    }
                ////}

                ////listView1.Items.Clear();

                ////for (i = 0; i < listView.Items.Count; i++)
                ////{
                ////    listView1.Items.Add(listView.Items[i].Clone() as ListViewItem);
                ////}

                //foreach (ListViewItem item in listViewCollection)
                //{
                //    listView1.Items.Add(item.Clone() as ListViewItem);
                //}

                SetWindowTheme(listView1.Handle, "Explorer", null);
                limpando = false;
            }

           // SetWindowTheme(listView1.Handle, "Explorer", null);
        }
4

1 回答 1

1

如果您只想从列表视图中删除所选项目,则此代码将起作用。

foreach (ListViewItem item in listView1.SelectedItems)
{
    listView1.Items.Remove(item);
}
于 2012-06-21T12:01:25.613 回答