InvalidArgument=当尝试仅获取 ListView 中的选定项目时,“0”的值对 'index' 无效

InvalidArgument=Value of '0' is not valid for 'index' when trying to get only selected item in a ListView

所以我试图从列表视图中删除一个项目并从文本中删除一行。我使用了 SelectedItems[0],它给了我一个错误。是的,我确实将多选设置为 false。

错误日志:

 InvalidArgument=Value of '0' is not valid for 'index'.

我的代码:

        DialogResult msgBox = MessageBox.Show("Are you sure you want to remove this port?", "Are you sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

        if (msgBox == DialogResult.No)
        {
            // Do nothing
        }
        if (msgBox == DialogResult.Yes) 
        {
            listView1.SelectedItems[0].Remove();

            StreamReader sr = File.OpenText("ports.cfg");
            string srStr = sr.ReadToEnd().ToString();
            sr.Close();

            List<String> linesList = File.ReadAllLines("ports.cfg").ToList();
            linesList.RemoveAt(listView1.SelectedItems[0].Index);
            File.WriteAllLines("ports.cfg", linesList);
            linesList.ToArray();
        }

没有适当的 minimal, reproducible example 就无法分辨。但是在上面的代码中,您似乎首先从 ListView 本身中删除了所需的项目,然后您尝试从同一项目中检索 Index 属性,大概是您刚刚已删除。

SelectedItems 将因删除项目而变成空的(因为你说你 "...将多选设置为 false"),所以当你尝试检索索引 0 处的元素,当然那里没有。

即使有,您也不会最终得到您真正想要的物品,因为您已经从 SelectedItems collection 中移除了您想要从 [=16 中移除的物品=] 稍后。仍然留在 SelectedItems collection 中的任何项目将是完全不同的项目,而不是您想要从 ports.cfg 文件中删除的项目。

我认为像这样的东西会更好:

ListViewItem portItem = listView1.SelectedItems[0];
int portIndex = portItem.Index;

portItem.Remove();

StreamReader sr = File.OpenText("ports.cfg");
string srStr = sr.ReadToEnd().ToString();
sr.Close();

List<String> linesList = File.ReadAllLines("ports.cfg").ToList();
linesList.RemoveAt(portIndex);
File.WriteAllLines("ports.cfg", linesList);
linesList.ToArray();

当然,上面的假设是在到达此代码时,您已经确认确实选择了一个项目。如果不是这种情况,那么您还需要为此添加检查,方法是检查 SelectedItems.Count 属性 以确保它大于 0。