飞道的博客

c# 学习笔记 (2) 窗体之间互相调用的方法

351人阅读  评论(0)

c# 学习笔记 (2) 窗体之间互相调用的方法

创建一个winform工程


创建两个窗体

一个子窗体,一个父窗体,这里为了演示,子窗体和父窗体上都有一个文本框和按键,点击任意一个窗体上的按键,窗体上文本框的内容会同步到另外一个窗体的文本框上。



添加控件textbox和button,然后双击button,添加按键单击事件,子窗体类似。

父窗体向子窗体传值

最常见的方法就是子窗体中创建一个public方法,在父窗体中调用该方法将参数传递给子窗体

子窗体中声明一个txbPrint方法,将接收到的str显示在子窗体文本框内

        public void txbPrint(string str)
        {
   
            txbInfo.Text = str;
        }

父窗体

		FormChild formChild = new FormChild();
        private void FormMain_Load(object sender, EventArgs e)
        {
   
            formChild.Show();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
   
            formChild.txbPrint(txbInfo.Text);
        }

子窗体向父窗体传值

方法一 通过静态字段传值

  • 像上面父窗体向子窗体传值一样,子窗体也可以通过类似的方法向父窗体传值,不过一般不要这样用,会破坏代码封装性,别人看了会嫌弃的

在主窗体中添加一个静态字段,窗体加载时将this指针赋值给formMain,然后在子窗体中就可以通过静态字段formMain操作类中的public方法

	//主窗体
	public partial class FormMain : Form
    {
   
        public static FormMain formMain;
        public FormMain()
        {
   
            InitializeComponent();
        }

        FormChild formChild = new FormChild();
        private void FormMain_Load(object sender, EventArgs e)
        {
   
            formMain = this;
            formChild.Show();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
   
            formChild.txbPrint(txbInfo.Text);
        }
    }
	
	//子窗体
    public partial class FormChild : Form
    {
   
        public FormChild()
        {
   
            InitializeComponent();
        }

        public void txbPrint(string str)
        {
   
            txbInfo.Text = str;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
   
            //通过静态字段传值
            FormMain.formMain.txbPrint("txbInfo.Text");
        }
    }

方法二 通过委托传值

  • 个人感觉C# 中的委托和C语言中的指针函数有点类似。
  • 通过委托传值,首先声明一个委托类 本例子中 public delegate void SendLogDelegate(string str); 这个委托类可以生成 参数是string类型 没有返回值的委托,和C语言中声明指针函数类似
  • 然后通过这个委托类在子窗体中实例化一个委托 public SendLogDelegate sendLogDelegate;
  • 最后在主窗体中,实例化子窗体时,给委托 sendLogDelegate 赋值 txbPrint
  • 然后在子窗体中使用该委托,就相当于调用了主窗体中的 txbPrint函数
	//主窗体
	public partial class FormMain : Form
    {
   
        public FormMain()
        {
   
            InitializeComponent();
        }

        FormChild formChild = new FormChild();
        private void FormMain_Load(object sender, EventArgs e)
        {
   
            //给委托赋值 调用该委托即调用 txbPrint方法
            formChild.sendLogDelegate = txbPrint;
            formChild.Show();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
   
            formChild.txbPrint(txbInfo.Text);
        }

        public void txbPrint(string str)
        {
   
            txbInfo.Text = str;
        }
    }

	//创建一个委托类 这个委托类可以 生成参数是string类型 没有返回值的委托
    public delegate void SendLogDelegate(string str);
	//子窗体
    public partial class FormChild : Form
    {
   
        //实例化一个委托 
        public SendLogDelegate sendLogDelegate;

        public FormChild()
        {
   
            InitializeComponent();
        }

        public void txbPrint(string str)
        {
   
            txbInfo.Text = str;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
   
            if(sendLogDelegate != null)
            {
   
                //调用委托 
                sendLogDelegate(txbInfo.Text);
            }
        }
    }

方法三 传递简单参数

  • 一些情况下,主窗体仅需要获取子窗体关闭后的一些简单状态,如true或者false,这里可以使用窗体中的自带的字段来解决 this.DialogResult ,这个一般用在关闭子窗体时,修改子窗体的 this.DialogResult ,然后在主窗体中检查子窗体的 DialogResult 来传递参数,用的不多。

转载:https://blog.csdn.net/weixin_42378319/article/details/115671214
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场