C# 让listbox为其所有项调用ToString方法
我有一个列表框,其中包含一组PathItems。根据用户的偏好,我已经用两种不同的情况覆盖了ToString方法 它基本上是包含在自定义对象中的文件名列表C# 让listbox为其所有项调用ToString方法,c#,winforms,C#,Winforms,我有一个列表框,其中包含一组PathItems。根据用户的偏好,我已经用两种不同的情况覆盖了ToString方法 它基本上是包含在自定义对象中的文件名列表 class PathItem { public static bool show_ext { get; set; } public static bool use_full_path { get; set; } public string filepath { get; set; } public overr
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有两个复选框。一个复选框将显示文件扩展名,另一个复选框将显示文件的绝对路径。检查其中任何一项都将更新上面定义的静态变量
每当我选中复选框时,我都希望列表框更新以反映用户的选择
我相信解决方案是让listbox通过再次调用ToString方法来刷新它的所有项,以获得每个项的新值,但我不确定如何做到这一点
我也不确定这是不是真的,但如果我说
PathItem.show_ext = true;
这是否适用于所有现有的PathItem
对象
更新:
按照建议尝试刷新
方法后,即使选中复选框,列表框中的字符串也不会更新(它们会在ClickChanged上触发刷新调用)。在ToString
方法中编写了一条print语句,但刷新后,没有打印出任何消息
不确定这是否是因为我在列表框中使用自定义对象
这就是我将项目添加到列表框的方式
foreach (string filename in files)
listBox1.Items.Add(new PathItem { filepath = filename });
有趣的是
myListBox.Refresh()
不会导致ListBox对包含的对象重新计算ToString()。大概这些值被缓存在某个地方
您可以使用以下方法强制ListBox重新计算ToString()。我在我的列表框中(在一台快速的计算机上)测试了超过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();
}
将立即影响从该点开始引用*show_ext*的每个PathItem实例,因为*show_ext*是一个静态变量。它在任何时间点都只有一个值,该值在该类的所有实例之间共享。我原以为
Refresh
可以做到这一点,但现在我在自定义ToString
方法中添加了一些print语句,在刷新列表框时实际上没有调用它。我想知道这是否是因为我的列表框的项中有那些自定义的PathItem
对象。请给我一点时间来研究一下。用一个测试过的解决方案更新了我的答案。看看控件刷新自己时实际在做什么会很有趣。但是这个解决方案看起来不应该有任何奇怪的副作用,所以我现在就用它。它不是“缓存”它们,而是在每个对象上调用ToString
,并在插入项时将结果传递给本机Win32 ListBox控件。我想你可以说它正在缓存这些值。但是,Refresh
不起作用的原因是它不会删除并重新填充由WinForms包装的Win32控件。您必须手动执行此操作,就像您在这里所做的那样。
PathItem.show_ext = true;