winfom 项目中,封装的类调用form1的控件。请问如何实现。

ROGER DENG 2020-09-11 02:40:45
本人的项目,也是新手。项目已经做完了,.net framework的winform的项目。
在主界面(form1)上有一个richtextbox用于做运行监控,输出运行时候的各种数据。

本人用.cs文件封装了几个类. 用于做不同的操作,想把这些类运行过程中的数据(比如I/O读写失败),也上报到form1的richtextbox中,请问如何实现呢?目前是用messagebox实现的。

非常感谢。
...全文
6797 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
八爻老骥 2020-09-15
  • 打赏
  • 举报
回复
如4楼所讲,定义一个中间结构。


class MessageHolder
{
private MessageHolder()
{

}
private System.Collections.Concurrent.ConcurrentQueue<string> msgs = new System.Collections.Concurrent.ConcurrentQueue<string>();

public System.Collections.Concurrent.ConcurrentQueue<string> Messages => msgs;
private static MessageHolder _instance;
public static MessageHolder Instance
{
get
{
if (_instance == null)
{
_instance = new MessageHolder();
}
return _instance;
}
}
public event Action<string> MessagePushed;

public void Push(string msg)
{
msgs.Enqueue(msg);
if (MessagePushed != null)
{
MessagePushed(msg);
}
}
}

static void Main(string[] args)
{

MessageHolder.Instance.MessagePushed += new Action<string>(msg =>
{

Console.WriteLine(msg);

while (!MessageHolder.Instance.Messages.IsEmpty)
{
var msg1 = "";
MessageHolder.Instance.Messages.TryDequeue(out msg1);
if (!string.IsNullOrEmpty(msg1))
Console.WriteLine(msg1);
}
});

MessageHolder.Instance.Push("Show something..");
}
昨天忆 2020-09-15
  • 打赏
  • 举报
回复
正怒月神 2020-09-14
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e)
        {
            Test t = new Test();
            //事件实现
            t.act = new Action(()=> {
                var str = t.GetText();
                this.textBox1.Text = str;
            });
            //订阅事件
            this.textBox1.BeginInvoke(t.act);
        }

        public class Test
        {
            public Action act;
            //模拟获取信息
            public string GetText()
            {
                return "123";
            }
        }
正怒月神 2020-09-14
  • 打赏
  • 举报
回复
richtextbox.BeginInvoke(你的类.读取io)
datafansbj 2020-09-11
  • 打赏
  • 举报
回复
这类问题比较好的解决方法是:
1、设计一个专门处理消息的中间类,用于接收、存储、转发,并公开相应的事件
2、所有产生消息的组件,向这个中间类发送消息
3、所有要提取消息的组件,向这个中间组件注册相应的委托,用于接收消息通知

依赖关系为:
产生消息的组件 -> 中间件
提取消息的组件 -> 中间件

产生消息的组件与提取消息的组件之间没有依赖。
Bridge_go 2020-09-11
  • 打赏
  • 举报
回复
共用一个对象写入数据,主窗体订阅事件就可以了

public class RunLog
{
    public static event Action<string> MessageEvent;

    public static void WriteLine(string text)
    {
        if(MessageEvent ! = null)
        {
            MessageEvent(text);
        }
    }
}
心受伤易碎 2020-09-11
  • 打赏
  • 举报
回复
首先将主界面(form1)对象实例作为参数传入封装的类中,然后将RichTextBox的访问性改为public,用该就可以了。
晨易夕 2020-09-11
  • 打赏
  • 举报
回复
进行监控状态输出,应该由它所在的模块统一进行管理。 如果你非得在自己封装的类里面直接调用控件,可以使用传递参数的方式给方法使用。 另外: 应该注意你自己模块的所在线程。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧