2015-02-09 51 views
0

我正在尋找一種方法來調用全局方法將數據記錄到同一文本文件和列表框中的任何位置(例如在不同的課程中)。創建列表<String>的引用或淺表副本<String>要綁定到列表框

我的實現涉及到有一個靜態類,它記錄到文本文件並更新列表數據。

列表數據是一個全局變量,可以訪問命名空間中的任何位置。最後,我希望通過綁定

listbox1.DataSource = logList; 

會解決問題。但是,顯然它執行深度複製而不是淺度複製。 :(

有沒有列表的引用綁定方式不是克隆

這裏有涉及代碼:

namespace Test 
{ 
    static class LOGS 
    { 
     public static void LOG_PRINT(string logMessage) 
     { 
      try 
      { 
       if (logMessage == "") return; 
       // Output to text file. 
       using (StreamWriter w = System.IO.File.AppendText(cls_globalvariables.systemlogpath)) 
       { 
        w.WriteLine("[" + DateTime.Now + "][" + logMessage + "]"); 
        w.Close(); 
       } 
       // Save to memory 
       cls_globalvariables.logList.Add(logMessage); 
      } 
      catch (Exception) 
      { } 
     } 
    } // 

    public static class cls_globalvariables 
    { 
     public static List<string> logList = new List<string>(); 

     public static string systemlogpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\logs.txt"; 
     ..... 
    } 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      // Model -> View Concept 
      listBox1.DataSource = cls_globalvariables.logList; 
      LOGS.LOG_PRINT("Hello"); 
     } // 
    } 
} 
+1

您只是引用列表。沒有複製/深層複製或shollow複製。什麼是不工作的期望?我想你需要一個BindingList 。 – Peter 2015-02-09 10:03:04

+0

向列表中添加字符串條目後,列表框不顯示任何內容。 但如果我通過在將列表綁定到數據源之前先執行add()方法來交換它們,它會顯示列表。 – Xegara 2015-02-09 10:04:26

回答

1

的List不支持綁定事件,有名單與數據綁定事件,你需要使用的BindingList。

public static class cls_globalvariables 
{ 
    public static BindingList<string> logList = new BindingList<string>(); 

或者你可以使用一個ObservableCollection<T>

+0

我應該再次打電話給這條線 listBox1.DataSource = cls_globalvariables.logList; ListChanged事件中的 ?似乎不工作。 – Xegara 2015-02-09 10:15:02

+0

如果您正在使用BindingList,綁定將爲您執行此操作。無需重新綁定。 – Peter 2015-02-09 10:31:58

+0

使用BindingList的目的不在於其數據綁定事件的能力嗎?是不是ListChanged事件是你引用的事件? – Xegara 2015-02-10 01:49:41

0

我找到了一個臨時解決方案。首先,我嘗試了。

1.)更改全局變量以鍵入BindingList列表。

2.)listBox1.DataSource = list;在構造函數中。

3.)在編號2後添加一個條目到全局變量列表中,但它沒有工作。

4.)我也嘗試重新綁定ListChanged事件中的DataSource,但無濟於事。

然後我試了下面,它的工作。

1.)更改全局變量以鍵入BindingList列表。

2)這裏是代碼片段:

public partial class Form1 : Form 
{ 
    List<String> _mList; 
    public Form1() 
    { 
     InitializeComponent(); 
     // Model -> View Concept 
     _mList = new List<string>(); 
     cls_globalvariables.logList.ListChanged += new ListChangedEventHandler(logList_ListChanged); 
     listBox1.DataSource = _mList; 
     LOGS.LOG_PRINT("Hello"); 
     LOGS.LOG_PRINT("Hello"); 
     LOGS.LOG_PRINT("Hello"); 
    } 

    void logList_ListChanged(object sender, ListChangedEventArgs e) 
    { 
     listBox1.DataSource = null; 
     if (cls_globalvariables.logList.Count != 0) 
      _mList.Add(cls_globalvariables.logList[cls_globalvariables.logList.Count - 1]); 
     listBox1.DataSource = _mList; 
    } // 
    .... 
} 

我增加了一個成員變量列表,因爲重新綁定列表到列表框控件的作品,同時重新綁定的BindingList到列表框控件不起作用。我仍然不知道爲什麼它不起作用。