2012-08-09 79 views
0

我有一個列表框,其中包含一組PathItems。根據用戶的喜好,我用一些不同的情況重寫了ToString方法。有一個列表框調用所有項目的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對象?

UPDATE:

嘗試Refresh方法的建議後,在列表框中的字符串沒有更新,即使複選框被選中(他們把火關上ClickChanged刷新調用)。在ToString方法中寫了一條打印語句,但刷新後沒有打印出任何消息。

不知道這是因爲我在我的列表框中使用自定義對象。

這是我怎麼就包含的對象將項目添加到我的列表框中

foreach (string filename in files) 
    listBox1.Items.Add(new PathItem { filepath = filename }); 

回答

2

有趣的是,呼籲

myListBox.Refresh() 

原因列表框重新評估的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(); 
    } 

此外,

PathItem.show_ext = true; 

馬上會影響到每一個PathItem實例的引用* show_ext *從該點向前,因爲* show_ext *是一個靜態變量。它在任何時間點都只有一個值,它在該類的所有實例之間共享。

+0

我在想'刷新'會做伎倆,但現在我已經在一些打印語句中添加了自定義的'ToString'方法,實際上在刷新列表框時並沒有被調用。我想知道是否因爲我的列表框的項目中有這些自定義的'PathItem'對象。 – MxyL 2012-08-09 04:36:54

+0

給我一點時間來看看這個。 – 2012-08-09 04:46:44

+0

用經過測試的解決方案更新了我的答案。 – 2012-08-09 05:02:40

相關問題