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

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

创建一个winform工程

c# 学习笔记 (2) 窗体之间互相调用的方法_第1张图片
c# 学习笔记 (2) 窗体之间互相调用的方法_第2张图片

c# 学习笔记 (2) 窗体之间互相调用的方法_第3张图片

创建两个窗体

一个子窗体,一个父窗体,这里为了演示,子窗体和父窗体上都有一个文本框和按键,点击任意一个窗体上的按键,窗体上文本框的内容会同步到另外一个窗体的文本框上。
c# 学习笔记 (2) 窗体之间互相调用的方法_第4张图片

c# 学习笔记 (2) 窗体之间互相调用的方法_第5张图片
c# 学习笔记 (2) 窗体之间互相调用的方法_第6张图片
添加控件textbox和button,然后双击button,添加按键单击事件,子窗体类似。
c# 学习笔记 (2) 窗体之间互相调用的方法_第7张图片

父窗体向子窗体传值

最常见的方法就是子窗体中创建一个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 来传递参数,用的不多。

你可能感兴趣的:(c#学习笔记)