一、子父窗体通信
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");
}