一、先将主窗体FrmMain和子窗体FrmUser关联起来。

一、主窗体全部代码
public partial class FrmMain : Form
{
FrmUser mFrmUser = new FrmUser();
FrmPro mFrmPro = new FrmPro();
private static FrmMain frmMain;
public FrmMain()
{
InitializeComponent();
frmMain = this;//初始化主窗体
}
/// <summary>
/// 子窗体调用该方法后就可以调用主窗体的ShowMessage(string txt)方法,将信息显示是主窗体的label中
/// </summary>
/// <returns></returns>
public static FrmMain Instance()
{
if(frmMain == null)
{
return new FrmMain();
}
return frmMain;
}
/// <summary>
/// 用户管理按钮的点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUserPage_Click(object sender, EventArgs e)
{
pnlMain.Controls.Clear();
mFrmUser.TopLevel = false;//设置用户窗体为非顶级窗体,否则不能添加到主窗体的panel中
mFrmUser.Parent = pnlMain;//设置父窗体为主窗体
mFrmUser.Show();//将用户窗体显示出来
mFrmUser.StartTimer();//开启用户窗体中的定时器
}
/// <summary>
/// 项目按钮的点击事件,。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnProMng_Click(object sender, EventArgs e)
{
pnlMain.Controls.Clear();
mFrmUser.StopTimer();// 停止用户窗体的计时器
mFrmPro.TopLevel = false;
mFrmPro.Parent = pnlMain;
mFrmPro.Show();
}
/// <summary>
/// 子窗体信息通过这个方法显示到界面上
/// </summary>
/// <param name="txt"></param>
public void ShowMessage(string txt)
{
this.label1.Text = txt;
mFrmPro.SetText(txt);//将定时器的文本同步到项目窗体的label中
}
}
二、用户窗体代码
/// <summary>
/// 用户窗体
/// </summary>
public partial class FrmUser : Form
{
public FrmUser()
{
InitializeComponent();
}
/// <summary>
/// 启动定时器
/// </summary>
public void StartTimer()
{
timer1.Start();
}
/// <summary>
/// 关闭定时器,主窗体调用
/// </summary>
/// <returns></returns>
public bool StopTimer()
{
timer1.Stop();
return true;
}
int i = 0;
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = (i++).ToString();
FrmMain.Instance().ShowMessage((i++).ToString());//将计数器的值显示到主窗体的label中
}
}
三、项目窗体代码
/// <summary>
/// 项目窗体
/// </summary>
public partial class FrmPro : Form
{
public FrmPro()
{
InitializeComponent();
}
/// <summary>
/// 主窗体调用该方法显示
/// </summary>
/// <param name="tst"></param>
public void SetText(string tst)
{
label1.Text = tst;
}
}
效果:

本文介绍了一种在C#应用程序中实现主窗体与子窗体间通信的方法,详细展示了如何通过实例化子窗体并将其作为非顶级窗体嵌入到主窗体的Panel中,以及如何在子窗体触发事件时更新主窗体的界面。同时,文章还解释了如何在不同窗体间同步定时器状态和信息显示。

697

被折叠的 条评论
为什么被折叠?



