【问题标题】:ListView Items not getting renamed properlyListView 项目未正确重命名
【发布时间】:2016-07-02 22:26:59
【问题描述】:

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

例子:

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

(对不起临时表,我想会更容易理解)

所以现在每当我从 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() + @"_";
                }

            }
        }

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

我错过了什么,怎么了?

【问题讨论】:

  • 您是一次删除多个项目还是只选择了一项? IE的MultiSelect属性设置为true还是false?

标签: c# list listview naming


【解决方案1】:

我在您的代码中看到的第一件事是,在 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() + @"_";
            }

【讨论】:

  • 我试过了,没有区别,而且 i++ 将是正确的方法,因为它返回 i + 1 但保持 i 的值与原来相同
  • @LikeIfYouCaredAboutMyName ,请注意,如果您执行 i++,它将始终更改 i 的值,但在您的情况下分配结束之后。请再试一次,我已经更新了我的答案。干杯!
  • 好的,谢谢。它正确地重命名了 de 项目,但给出了一个异常,指出索引无效,所以我认为我需要增加 i 但保留它的值。这可能吗?
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2021-06-26
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多