我有一个包含一组PathItem的列表框。我根据用户的偏好,用几种不同的情况覆盖了ToString方法。
它基本上是自定义对象中包含的文件名列表。
class PathItem
{
public static bool show_ext { get; set; }
public static bool use_full_path { get; set; }
public string filepath { get; set; }
public override string ToString()
{
if (use_full_path)
return filepath;
else if (show_ext)
return Path.GetFileName(filepath);
else
return Path.GetFileNameWithoutExtension(filepath);
}
}
GUI有两个复选框。一个复选框将显示文件扩展名,另一个复选框将显示文件的绝对路径。检查其中任何一个都将更新上面定义的静态变量。
每当我选中一个复选框时,我希望更新列表框以反映用户的选择。
我认为解决方案是让列表框通过再次调用ToString方法刷新所有项目以获取每个项目的新值,但我不确定如何做到这一点。
此外,我不确定这是否属实,但如果我说
PathItem.show_ext = true;
这适用于所有现有的PathItem
个对象吗?
更新:
按照建议尝试Refresh
方法后,即使选中了复选框,它们也不会更新列表框中的字符串(它们会触发ClickChanged上的刷新调用)。在ToString
方法中写了一个print语句,但刷新后没有打印出任何消息。
不确定这是否是因为我在列表框中使用自定义对象。
这就是我在列表框中添加项目的方式
foreach (string filename in files)
listBox1.Items.Add(new PathItem { filepath = filename });
答案 0 :(得分:2)
有趣的是,打电话
myListBox.Refresh()
不导致ListBox在包含的对象上重新评估ToString()。据推测,这些值会缓存在某处。
您可以使用以下方法强制ListBox重新评估ToString()。我在ListBox中(在快速计算机上)使用> 100项测试它,并且没有看到任何视觉伪像或延迟。
private void UpdateToString(ListBox listBox)
{
int count = listBox.Items.Count;
listBox.SuspendLayout();
for (int i = 0; i < count; i++)
{
listBox.Items[i] = listBox.Items[i];
}
listBox.ResumeLayout();
}
此外,
PathItem.show_ext = true;
会立即影响从该点开始引用* show_ext *的每个PathItem实例,因为* show_ext *是一个静态变量。它在任何时间点只有一个值,在该类的所有实例之间共享。