使用列表框为其所有项调用ToString方法

时间:2012-08-09 04:25:51

标签: c# winforms

我有一个包含一组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 });

1 个答案:

答案 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 *是一个静态变量。它在任何时间点只有一个值,在该类的所有实例之间共享。