请教,怎样在其他类中修改主窗口控件值。

bosixiaolanmiao_ 2018-01-19 05:11:23
各位好,c#新手,自学中。。。
想自己开发个上位机,现在遇到修改控件属性的问题。
先看一下工程架构。

新建类COMclass 为串口处理类,COMclass处理USB接受的数据,然后再主form显示,该怎样做。
试着直接在COMclass中操作控件,但在COMclass中找不到主form控件,将控件public也不行。
想请教各位高人有什么好的处理方法吗。感谢。。。
...全文
553 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
FainSheeg 2018-01-22
  • 打赏
  • 举报
回复
给你举个粟子:

class comclass
    {
        private BackgroundWorker bgw;
        public delegate void DataChanged(object sender, DoWorkEventArgs e);
        public event DataChanged datachanged;
        public comclass()
        {
            bgw.DoWork += bgw_Dowork;
        }
        private void bgw_Dowork(object sender, DoWorkEventArgs e)
        {
            datachanged(sender, e);
        }
    }

public partial class Form1 : Form
    {
        private comclass cc=new comclass();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cc.datachanged += cc_datachanged;
        }
        private void cc_datachanged(object sender, DoWorkEventArgs e)
        {
            if ((string)e.Result != "")
            {
                this.Text = (string)e.Result;
            }
        }
    }
只有框架,你参考一下吧。
bosixiaolanmiao_ 2018-01-20
  • 打赏
  • 举报
回复
引用 4 楼 yangliu0512 的回复:
方向错了,不应该试图在com类里去改动主窗体。而应该在主窗体中实例化com类,再根据com类的信息自己去修改控件值。如果修改的条件是由com类触发的,则应该在主窗体中绑定触发事件,在事件代码中修改控件值。
你好,刚学习C#,不是很懂。我现在想做串口的上位机,主UI需要显示更新大量的数据。上位机发送指令,下位机返回数据,我的数据接收与处理是在我新建的COM类backgrondworker执行的.1.如果由COM类事件触发,那应该是接收到一条数据触发一次(这样是不是要在主form每个数显控件绑定事件),还是有其他更好的方法。2.如果住窗体主动修改,是不是要在主窗体中执行while()刷新。
wzn0521 2018-01-20
  • 打赏
  • 举报
回复
最好不要在类中去修改主窗口的值,你可以在类中定义个事件,在主窗口里进行属性的修改;第二种方法是把form传给类,但要修改窗口里的控件属性,还需要把控件设置成public(默认是private)。
bosixiaolanmiao_ 2018-01-20
  • 打赏
  • 举报
回复
引用 5 楼 zhuo_wp 的回复:
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

ComClass c = new ComClass();
c.action = new Action<string>(ChangeButtonName);

c.Do();
}

private void ChangeButtonName(string buttonName)
{
button1.Name = buttonName;
}
}

public class ComClass
{
public Action<string> action { get; set; }

public void Do()
{
if(action != null)
{
action("修改后的控件名");
}
}
}
}


可以用委托的方式


你好,用委托要using什么吗 为什么我new COMclass 点不出action.
  • 打赏
  • 举报
回复
练习
  • 打赏
  • 举报
回复
这就好像你使用的 SerialPort 类,怎么它就知道设计 DataReceived、PinChanged 等事件把一些参数推送给宿主啊?为什么它不说“修改你的窗口中的内存变量”啊? 因为设计上根本不可能。人家设计这个 SerialPort 就知道它要用到不同的宿主中。所以事件机制在你用到的所有高级的东西中都是核心,不了解如何自定义事件,那么你就有起码一半的软件设计知识根本没有学过、没有联系过程序设计。
  • 打赏
  • 举报
回复
开发一个“串口类”你就应该把它作为一个通用服务,给各种“客户”使用,任何窗口、组件、业务类都可以使用到它,而它不纠结于什么“修改谁谁谁的控件值”这种东西。所以学点软件工程设计知识,不要只知道抄个别底层代码,这个要求伴随着编程工作的一生。而要设计开发啊一个服务你当然就要使用事件驱动方式来通知宿主自己有数据提交,或者通知宿主应该来取数据,要有设计上的“依赖倒置”的知识。
大鱼> 2018-01-20
  • 打赏
  • 举报
回复
使用委托吧。
zhuowp 2018-01-20
  • 打赏
  • 举报
回复
public class ComClass { public Action<string> action { get; set; } public void Do() { if(action != null) { action("修改后的控件名"); } } } 你要在ComClass类中声明这个属性。 委托简单的理解,可以认为是传递了一个方法(注意是传递方法而不是传递参数) 你要在一个类A里修改一个主窗口中的内容,但是在类A里是没法获得主窗口的内容的,这个时候你有两个选择,第一,将主窗口类当做参数传递到A类中,楼上有小伙伴就是这么做的,第二,将你要修改主窗口的方法在主窗口类中写好,然后将这个方法传递到类A中,A调用这个方法就可以了,这就是利用委托的方式来实现,也是我的例子的方法。
zhuowp 2018-01-19
  • 打赏
  • 举报
回复
namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ComClass c = new ComClass();
            c.action = new Action<string>(ChangeButtonName);

            c.Do();
        }

        private void ChangeButtonName(string buttonName)
        {
            button1.Name = buttonName;
        }
    }

    public class ComClass
    {
        public Action<string> action { get; set; }
         
        public void Do()
        {
            if(action != null)
            {
                action("修改后的控件名");
            }
        }
    }
}
可以用委托的方式
FainSheeg 2018-01-19
  • 打赏
  • 举报
回复
方向错了,不应该试图在com类里去改动主窗体。而应该在主窗体中实例化com类,再根据com类的信息自己去修改控件值。如果修改的条件是由com类触发的,则应该在主窗体中绑定触发事件,在事件代码中修改控件值。
秋的红果实 2018-01-19
  • 打赏
  • 举报
回复

namespace testProject
{
    class COMclass
    {
        //.................
        public void showText(Form1 f1)
        {
            f1.label4.Text = "myValue";
        }
    }
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            COMclass comClass = new COMclass();
            Form1 f1 = new Form1();
            comClass.showText(f1);


        }
    }
}
秋的红果实 2018-01-19
  • 打赏
  • 举报
回复
你可以在program.cs里面,实例化一个COMclass的对象,COMclass类里面,需要将Form1以参数方式传进去,就可以操作了
xiaoyu5425 2018-01-19
  • 打赏
  • 举报
回复
from传进去,在fom中用委托写个方法,调一下不就好了吗

110,536

社区成员

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

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

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