C#Winform中窗体之间通信

一、子父窗体通信

1.使用公共静态变量传值

主窗体frmMain中代码

public partial class frmMain : Form
{
 //声明工位ID 为公共静态变量
 public static string terminalID = "";
 //给静态变量赋值
 terminalID = "q13bh01-bh12";
 }

子窗体frmGroup中代码

private void frmGroup_Load(object sender, EventArgs e)
{
    this.txtTerminalID.Text= frmMain.terminalID.Trim(); 
    //可以再赋值给静态成员,方便其他窗体调用
    frmMain.terminalID = "q13bh01-bh11";
}

特点 : 双向传值,实现简单
缺点: 静态变量在类加载的时候分配内存,存储于方法区,一般不会被销毁,在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。

2.使用公共变量传值

主窗体frmMain中代码

public partial class frmMain : Form
{
 //声明工位ID 为公共变量
 public string terminalID = "";
 //给变量赋值
 terminalID = "q13bh01-bh12";
 //单击‘行为’按钮的时候会给窗体传值
  private void btnGroup_Click(object sender, EventArgs e)
        {
            frmGroup frmGro = new  frmGroup();
            //变量传值 ,注意顺序写在ShowDialog()方法之前
            frmGro .stationID = this.terminalID;
            frmGro .ShowDialog();
        }
 }

子窗体frmGroup中代码

`public partial class frmGroup : Form
  {
    //定义公共属性
    public string stationID = "";
  }

特点 : 单向传值,只能主窗体给子窗体传值,实现简单

3.使用事件传值

首先定义一个事件

 public class RefreshEventArg : EventArgs
    {
        public string Text { get; set; }
    }

子窗体:

    public partial class frmGroup : Form
    {
        public frmGroup()
        {
            InitializeComponent();
        }
        public void ShowText(string strData)
        {
            textBox1.Text = strData;
            textBox1.Refresh();
        }
        public void AfterTxtChange(object sender, EventArgs e)
        {
            //拿到父窗体传来的文本,强转数据类型
            RefreshEventArg arg = e as RefreshEventArg;
            this.ShowText(arg.Text);
        }
    }

主窗体:

  public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        public event EventHandler AfterMsgChange;
        ///事件具体实现
        private void SetContent_Click(object sender, EventArgs e)
        {
            AfterMsgChange(this, new RefreshEventArg() { Text = this.textBox1.Text });
        }
        private void btnGroup_Click(object sender, EventArgs e)
        {
            frmGroup jsd = new frmGroup();
            //初始化事件  
            AfterMsgChange += jsd.AfterTxtChange;
            jsd.Show();
            
        }
    }

特点 :适合数据实时回传。

二、非子父窗体通信

     /// <summary>
        /// 等待服务器连接,并且创建一个负责通信的Socket
        /// </summary>
        void Listen(Socket socketWatch)
        {
            //负责监听的Socket来接收客户端的连接
            while (true)
            {
                //接收客户端消息线程
                Task.Run(() => Recive(socketSend));

            }
        }
        /// <summary>
        /// 不停的接受服务器发来的消息
        /// </summary>
        void Recive(Socket socketWatch)
        {
            while (true)
            {
                try
                {
                    //客户端连接成功后,服务器应该接受客户端发来的消息
                    byte[] buffer = new byte[1024 * 1024 * 4];
                    int r = socketWatch.Receive(buffer);

       if (buffer[0] == 0)
          {
            string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
          this.Invoke(new Action<string>(ShowMsg), socketWatch.RemoteEndPoint.ToString() + ":" + str);
          }
             }
                catch (Exception ex)
                {

                    throw;
                }

                Thread.Sleep(1000);
               
            }
        }
        /// <summary>
        /// 记录操作
        /// </summary>
        /// <param name="str"></param>
        void ShowMsg(string str)
        {
            txtLog.AppendText(str + "\r\n");
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾里看花0514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值