在我的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
答案 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)));
}
我会更新原始问题中的代码段,以便更加一致,并且更容易看到更改。