我在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;因为它不是委托类型
答案 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
类,你可以增强它以提供一个标志来停止轮询,调整轮询的频率,并可能缓存一定数量的历史数据,这样如果另一个控件为事件注册自己,它将发送一些最近调查的数据。