创建List <string>的引用或浅表副本以绑定到listbox </string>

时间:2015-02-09 09:56:46

标签: c# reference shallow-copy

我正在寻找一种方法,以便能够在命名空间中的任何位置(例如,在不同的类中)调用数据到同一文本文件和列表框的全局方法。

我的实现涉及一个静态类,它记录到文本文件并更新List数据。

List数据是一个全局变量,可以访问命名空间中的任何位置。最后,我希望通过绑定

 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");
        } //
    }
}

2 个答案:

答案 0 :(得分:1)

List不支持数据绑定事件,要有使用BindingList所需的数据绑定事件的列表。

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

或者您可以使用ObservableCollection<T>

答案 1 :(得分: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;
    } //
    ....
 }

我添加了一个成员变量List,因为将List重新绑定到listBox工作,而将BindingList绑定到listBox不起作用。我仍然不知道为什么它不起作用。