ListView 项目未正确重命名

ListView Items not getting renamed properly

我有一个包含两列的 list view:一列用于前缀,一列用于连接字符串。

示例:

Prefix| Connection string
--------------------------
OR1_  | blablabla
--------------------------
OR2_  | blebleble
--------------------------
OR3_  | blublublu
--------------------------

(临时凑合抱歉table,我觉得这样会更容易理解)

所以现在每当我从 listView 中删除一个项目时,我都需要重命名所有前缀所以想象一下,如果我删除项目编号 2,我最终会得到:

Prefix| Connection string
--------------------------
OR1_  | blablabla
--------------------------
OR3_  | blublublu
--------------------------

但我实际上需要它是 OR1_ 和 OR2_

所以我编写了这段代码,当我删除一个项目时会执行此操作:

 private void buttonDel_Click(object sender, EventArgs e)
        {
            if (listViewConnectionStrings.Items.Count == 0) return;
            else
            {
                //Delete the items
                foreach (ListViewItem eachItem in listViewConnectionStrings.SelectedItems)
                {
                    Connections.Remove(eachItem.Text);
                    listViewConnectionStrings.Items.Remove(eachItem);
                }
                if(listViewConnectionStrings.Items.Count == 0) return;

                //Rename the prefixes
                int cntItems = listViewConnectionStrings.Items.Count;
                for (int i = 0; i <= cntItems; i++)
                {
                    ListViewItem newItem = new ListViewItem();
                    newItem = listViewConnectionStrings.Items[0];
                    int newPrefix = i++;
                    newItem.Text = @"OR" + newPrefix.ToString() + @"_";
                }

            }
        }

当我删除列表中的第一个 第一个 项时,最后一个 for 工作正常,它会正确重命名所有其他项,但如果我在中间删除一个或者在底部,嗯,不是第一个,所有其他人都有相同的名字。

我错过了什么,怎么了?

我在你的代码中看到的第一件事是,在 for 循环中,你递增 i 两次,第一次是在循环的开始,第二次是在第二个块当您将它分配给 newPrefix 时,这可能是一个问题:

            int cntItems = listViewConnectionStrings.Items.Count;
            for (int i = 0; i <= cntItems; i++)//here you do i++
            {
                ListViewItem newItem = new ListViewItem();
                newItem = listViewConnectionStrings.Items[0];
                int newPrefix = i++;//here you increment i again
                newItem.Text = @"OR" + newPrefix.ToString() + @"_";
            }

当您想将 i 分配给 newPrefix 时应该使用什么,而不是插入不需要的行为是使用 i+1 而不是 i++

让我想到的第二件事是您如何使用 listViewConnectionStrings.Items 因为您从不更改项目的索引。它只使用了 Item[0]。您可以按以下两种修改方式重试:

            int cntItems = listViewConnectionStrings.Items.Count;
            for (int i = 0; i <= cntItems; i++)//here you do i++
            {
                ListViewItem newItem = new ListViewItem();
                newItem = listViewConnectionStrings.Items[i];
                int newPrefix = i+1;//here you increment i again
                newItem.Text = @"OR" + newPrefix.ToString() + @"_";
            }