在listview C#中编辑标签后防止持久编辑的标签

时间:2017-11-14 04:26:25

标签: c# winforms listview windows-explorer

在我的Winforms应用程序中,我想允许用户编辑listview项标签,就像在Windows资源管理器中重命名文件或文件夹时一样。我现在想要实现的是Windows资源管理器在重命名文件或文件夹时的行为。

为了实现这种效果,我调用了一个方法,该方法在AfterLabelEdit事件中重命名受影响的文件/文件夹,然后继续重新填充我的列表视图。如果重要,我的列表视图是一个虚拟列表视图,因此我的所有项目都存储在字典中。

我现在遇到的问题是,虽然文件正确重命名并且listview随着新名称反映在列表中而更新,但编辑后的标签仍保持不变,所以现在我看到2个listview项目具有相同的名称,其中一个是一个本地化的编辑文本,而另一个是实际的。结果是,本地化标签现在表示一个文件,其中包含listview不会显示的另一个名称。

以下是我当前逻辑的片段:

    private void UpdateListView(int index, string NewName)
    {
        items[index] = NewName;
        items.Sort();
        listViewItemsList.Clear();

        foreach(string item in items)
        {
            ListViewItem Item = new ListViewItem();
            Item.Text = item;
            listViewItemsList.Add(Item);
        }

        listView1.BeginUpdate();
        listView1.VirtualListSize = listViewItemsList.Count;
        listView1.EndUpdate();
    }

    private void listView1_AfterLabelEdit(object sender, LabelEditEventArgs e)
    {
        string newName = e.Label;
        UpdateListView(e.Item, newName);
    }

在删除标签编辑完成的本地化标签文本时,是否有人知道如何在编辑后刷新我的列表视图?

编辑:对于那些想要查看问题的人,请随意下载此项目文件并在listView中编辑标签。然后,点击"刷新"这个问题可以看出来。我收录了一个"显示实际数据"按钮以查看没有断点的列表项以及我希望listview在编辑标签后显示的内容。为了确保您看到问题,请务必编辑标签并提供一个新名称,以便在按字母顺序排序时重新排列。

下载示例项目的链接:https://app.box.com/s/t24ej9hbokcr3qcg8nkbs8slknf5ez5w

1 个答案:

答案 0 :(得分:0)

对于可能遇到此问题的任何人,我使用listView.BeginInvoke();来管理解决问题所以我的解决方案是在UpdateListView()方法内而不是BeginInvoke()内运行我的listView.AfterLabelEdit() 1}}根据MSDN的方法,

  

因为ListView.AfterLabelEdit事件在提交标签编辑之前发生,所以在此事件的处理程序中调用ListView.Sort方法将使用原始值对项目进行排序。

因此,在UpdateListView()中运行我的ListView.AfterLabelEdit()代码会导致我在上面的问题中提到的listview错误。另请注意,在这种情况下,我的列表视图位于virtualMode,因此我的列表视图基于列表。这是我最新的代码:

private void UpdateListView(int index, string NewName)
    {
            items[index] = NewName;
            items.Sort();
            listViewItemsList.Clear();

        foreach(string item in items)
        {
            ListViewItem Item = new ListViewItem();
            Item.Text = item;
            listViewItemsList.Add(Item);
        }

        listView1.BeginUpdate();
        listView1.VirtualListSize = listViewItemsList.Count;
        listView1.EndUpdate();
    }

private void listView1_AfterLabelEdit(object sender, LabelEditEventArgs e)
    {
        string newName = e.Label;
        listView1.BeginInvoke(new MethodInvoker(() => UpdateListView(e.Item, newName)));
    }

我会更新原始问题中的代码段,以便更加一致,并且更容易看到更改。