3

我在 C# WinForms 中有一个 listView1,它显示 2 个列表

List<string> pths;
List<string> rec;

public void Disp ()
        {

            DisplayListInColumns(listView1, pths, 0);
            DisplayListInColumns(listView1, rec, 1);
        }
private static void DisplayListInColumns(ListView listView, List<string> values, int columnIndex)
        {
            for (int index = 0; index < values.Count; index++)
            {
                while (index >= listView.Items.Count)
                {
                    listView.Items.Add(new ListViewItem());
                }
                ListViewItem listViewItem = listView.Items[index];
                while (listViewItem.SubItems.Count <= columnIndex)
                {
                    listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem());
                }
                listViewItem.SubItems[columnIndex].Text = values[index];
            }
        }

我正在使用全局列表进行更改并将其显示在 listview1 中,但只有在用户单击 apply_button 后才会保存更改(保存到 xml)。

编辑和添加详细信息按钮工作正常并且显示完美。但是当我删除数据时,我会抛出一个错误。

以下是删除操作:

//Configuration - DELETE button
        private void button6_Click(object sender, EventArgs e)
        {
            string select = null;

            if (listView1.SelectedItems.Count > 0)
            {
                select = (listView1.SelectedItems[0].Text);
            }
            int count = listView1.SelectedItems[0].Index;

            if (select != null)
            {
                pths.RemoveAt(count);
                rec.RemoveAt(count);
                string s = String.Join("; ", pths.ToArray());
                string r = String.Join("; ", rec.ToArray());
                //MessageBox.Show(s);
                //MessageBox.Show(r);                                
            }
            Disp();
        }

我认为经过几次尝试,我的索引出错了。即使在删除之后,在调试时我listView.Items.Count = 5. 猜我猜计数仍然是 5(列表中的样本 - 5 个字符串),当删除后它应该减少到 4 并且索引相应地减少到 0-3。我收到以下错误

ArgumentOutOfRangeException at pths.RemoveAt(count)
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

作为替代我尝试pths.Remove(select);但没有解决这个问题。

任何帮助,将不胜感激。谢谢

4

3 回答 3

2

更改您的 if 语句

if (select != null)

对此

if(!string.IsNullOrWhiteSpace(select))

您的 text 属性不会为空,它将是空字符串,因此当您认为自己不是时,您正在输入该部分。

编辑:

根据您的评论,我将引导您使用此解决方案,将您的整个删除功能替换为以下内容:

private void button6_Click(object sender, EventArgs e)
{
  foreach (ListViewItem eachItem in listView1.SelectedItems)
  {
    listView1.Items.Remove(eachItem);
    if (pths.Any(o => o == eachItem.Text))
    {
        pths.Remove(eachItem.Text);
    }
    if (rec.Any(o => o == eachItem.Text))
    {
        rec.Remove(eachItem.Text);
    }
  }
}

您可能需要 eachItem.Value ,但我认为 .Text 会起作用。

注意:我绝对只是从这里复制的这个答案(我不相信这个解决方案):

从 ListView 中删除所选项目

于 2013-03-27T18:36:18.317 回答
1

在尝试SelectedItem将其从List.

   private void button6_Click(object sender, EventArgs e)
    {
        string select = (listView1.SelectedItems.Count > 0) ? (listView1.SelectedItems[0].Text) : null;
        if (!string.IsNullOrWhiteSpace(select))
        {
            listView1.BeginUpdate();
            pths.Remove(select);
            rec.Remove(select);
            listView1.EndUpdate();

            string s = String.Join("; ", pths.ToArray());
            string r = String.Join("; ", rec.ToArray());                     
        }
        Disp();
    }
于 2013-03-27T18:47:40.440 回答
0

听起来你只需要重新加载你的列表......

//Clear it
listView1.Items.Clear();
//reload it.
listView1.Refresh();
于 2013-03-28T12:04:07.853 回答