Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 让listbox为其所有项调用ToString方法_C#_Winforms - Fatal编程技术网

C# 让listbox为其所有项调用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

我有一个列表框,其中包含一组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 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;