从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"类型。因为它不是委托类型

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

这个问题太宽泛了,无法给出一个有意义的答案。询问做某事的所有方法是不够具体的。也就是说,一个可能的想法是创建一个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类,您可以对其进行增强,以提供停止轮询的标志,调整轮询的频率,并可能缓存一定数量的历史数据,以便当另一个控件注册自己的事件时,它将发送一些最近轮询的数据。

相关文章: