阻止在列表视图C#中的标签编辑后持久编辑标签



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

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

我现在遇到的问题是,尽管文件重命名正确,并且列表视图随着新名称反映在列表中而更新,但编辑后的标签保持不变,所以现在我看到了两个具有相同名称的列表视图项目,其中一个是本地化的编辑文本,而另一个是实际的。由此产生的效果是,本地化标签现在表示一个具有其他名称的文件,而列表视图不会显示该文件。

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

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中编辑标签。然后,点击"刷新",就可以看到问题了。我包含了一个"显示实际数据"按钮,可以查看没有断点的列表项,以及我在编辑标签后实际希望列表视图显示的内容。为了确保您看到问题,请确保编辑标签并指定新名称,以便按字母顺序排序时重新排列。

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

对于任何可能遇到这个问题的人,我设法通过使用listView.BeginInvoke();解决了这个问题,所以我的解决方案是在BeginInvoke()方法中运行我的UpdateListView(),而不是根据MSDN,在listView.AfterLabelEdit()方法中运行

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

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

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)));
}

我将更新原始问题中的代码片段,以便有更多的一致性,更容易看到更改。

最新更新