从form1中的新类更新控件的所有方法是什么?

时间:2015-09-30 21:09:46

标签: c# .net winforms

我在form1中有一个listBox或listView或textBox,我想在现场更新它们。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Class1
    {
        string[] items = { "Item1", "Item2", "Item3", "Item4" };

        public Class1()
        {
            for (int i = 0; i < items.Length; i++)
            {
                // Here update add the items to the control in form1
            }
        }
    }
}

我想说我想更新form1中的listView。 但我不想等待,直到所有项目都将添加到listView,然后看到我希望每个项目将添加的项目,并将显示在listView中。就像在实时实时。所以我需要使用backgroundworker或者调用,我还需要以某种方式使form1中的控件可以在这个类中访问。

可能有一些方法可以做到这一点。 我知道你可以在新类中创建form1的实例,并在form1中使control / s变为public而不是private。但是,如果我想在不将form1中的control / s更改为public而不在新类中创建form1的新实例的情况下实现它是否可能?

我还可以创建另一个类,他将要做的就是使用新类和form1之间的全局变量进行通信。

有什么方法可以做到这一点,你怎么做?我认为这个问题对每个人都有帮助。

更新

首先我尝试这样做:

public static void doStuff(object objtoadd)
            {
                foreach (Form1 frm in Application.OpenForms.OfType<Form1>())
                {
                    frm.Invoke(() => frm.addItemToListBox(objtoadd));
                }
            }

错误已开启:()=&gt; frm.addItemToListBox(objtoadd)

错误1无法将lambda表达式转换为&#39; System.Delegate&#39;因为它不是委托类型

1 个答案:

答案 0 :(得分:0)

这个问题过于宽泛,无法给出有意义的答案。要求所有做某事的方法都不够具体。话虽这么说,一个可能的想法是创建一个提取数据的DataProvider类,并在收到新数据时提供事件。然后其他类(如用户控件)将注册这些事件。 E.g。

public class DataProvider {

    public event EventHandler DataReceived;
    public int PollingFrequencyMillis = 5000;

    public DataProvider() {
    }

    public void StartDataPolling() {
        Thread t = new Thread((o) => {
            var dp = (DataProvider) o;
            String[] items = null; // fetch the data whatever your source is
            if (dp.DataReceived != null && items != null && items.Length > 0) {
                dp.DataReceived(dp, new DataEventArgs(items));
            }
            Thread.Sleep(dp.PollingFrequencyMillis);
        });
        t.IsBackground = true;
        t.Start(this);
    }
}

public class DataEventArgs : EventArgs {
    public String[] Data { get; private set; }
    public DataEventArgs(String[] data) {
        Data = data;
    }
}

public class YourForm : Form {
    DataProvider dataProvider = new DataProvider();
    TextBox tb = new TextBox { Multiline = true, Dock = DockStyle.Fill };
    public YourForm() {
        dataProvider.DataReceived += dataProvider_DataReceived;
        dataProvider.StartDataPolling();
        Controls.Add(tb);
    }

    void dataProvider_DataReceived(object sender, EventArgs e) {
        DataEventArgs e2 = (DataEventArgs) e;
        RefreshTextBox(e2);
    }

    void RefreshTextBox(Object o) {
        if (InvokeRequired) {
            BeginInvoke(new Action<Object>((o2) => {
                RefreshTextBox(o2);
            }), o);
            return;
        }
        DataEventArgs e = (DataEventArgs) o;
        tb.AppendText(String.Join(Environment.NewLine, e.Data));
    }
}

对于DataProvider类,你可以增强它以提供一个标志来停止轮询,调整轮询的频率,并可能缓存一定数量的历史数据,这样如果另一个控件为事件注册自己,它将发送一些最近调查的数据。