从form1中的新类更新控件的所有方法是什么?
本文关键字:有方法 是什么 控件 更新 form1 新类 | 更新日期: 2023-09-27 18:15:17
我在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的实例,使控制/s是公共的,而不是私人的。但是,如果我想使它不改变控制/s在form1到公共,而不使form1的新实例在新的类是可能的吗?
我还可以创建另一个类,他所要做的就是在新类和form1之间使用全局变量进行通信。
做这件事的所有方法是什么,你怎么做?我想这个问题可能对大家都有帮助。
更新一开始我试着这样做:
public static void doStuff(object objtoadd)
{
foreach (Form1 frm in Application.OpenForms.OfType<Form1>())
{
frm.Invoke(() => frm.addItemToListBox(objtoadd));
}
}
error is on:() => frm.addItemToListBox(objtoadd)
错误1无法将lambda表达式转换为"System"类型。因为它不是委托类型
这个问题太宽泛了,无法给出一个有意义的答案。询问做某事的所有方法是不够具体的。也就是说,一个可能的想法是创建一个DataProvider
类来获取数据,并在接收到新数据时提供事件。然后,其他类(如用户控件)将注册这些事件。例如
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
类,您可以对其进行增强,以提供停止轮询的标志,调整轮询的频率,并可能缓存一定数量的历史数据,以便当另一个控件注册自己的事件时,它将发送一些最近轮询的数据。