C#窗体间传值方法汇总

昨天被骂惨了!
因为我写了一个C#父窗体控制子窗体的方法,我把modifiers属性改成了public 。本来只是说一下有这么个属性,没想到引起了这顿喷哈哈,虚心接受,感谢朋友们的支持 。
【C#窗体间传值方法汇总】我错了!我重新写!
最终效果,就是点主窗体的按钮,更改子窗体picturebox的图片

C#窗体间传值方法汇总

文章插图
 
新建项目,添加一个主窗体Form1和子窗体Form2,,,我们的任务是,在主窗体点击按钮控制子窗体的picturebox控件
1、第一种方法:基本是被高手不齿,不过还是比我昨天用的方法好哈哈Form2子窗体代码:
namespace FormConnections{public partial class Form2 : Form{public Form2(){InitializeComponent();}//建立一个公共函数用来更改pictureBox1的图片public void SetPic(){pictureBox1.ImageLocation = "c#.jpg";}private void pictureBox1_Click(object sender, EventArgs e){//点击图片清空,为了调试用pictureBox1.Image = null;}}}Form1调用这个函数就可以了:
namespace FormConnections{public partial class Form1 : Form{public Form1(){InitializeComponent();}//实例化两个子窗体Form2 f2 = null;private void Form1_Load(object sender, EventArgs e){//打开子窗体f2 = new Form2();f2.Show();}private void button2_Click(object sender, EventArgs e){//执行Form2的公共函数f2.SetPic();}}}2、第二种方法,用委托子窗体代码不变,父窗体代码:
namespace FormConnections{public partial class Form1 : Form{public Form1(){InitializeComponent();}Form2 f2 = new Form2();private void Form1_Load(object sender, EventArgs e){//打开子窗体f2.Show();}private void button2_Click(object sender, EventArgs e){//用委托去执行子窗体的内容this.Invoke(new Action(() =>{f2.SetPic();}));}}}3、第三种方法,用事件解决此类问题父窗体代码:
namespace FormConnections{public partial class Form1 : Form{public Form1(){InitializeComponent();}//定义绑定FORM2更改图片操作的事件public event EventHandler ChangeForm2Pic;private void Form1_Load(object sender, EventArgs e){Form2 f2 = new Form2();//父窗体加载时,实例化Form2,并绑定事件ChangeForm2Pic += f2.ChangePicEvent;f2.Show();}private void button2_Click(object sender, EventArgs e){//点击按钮,执行事件ChangeForm2Pic(this, new Form2.PicPathArg() { PicPath = "C#.jpg" });}}}子窗体代码:
namespace FormConnections{public partial class Form2 : Form{public Form2(){InitializeComponent();}//内部函数void GoSetPic(string picpath){pictureBox1.ImageLocation = picpath;}internal void ChangePicEvent(object sender, EventArgs e){//执行事件时,得到传递来的参数PicPathArg thepicpath = (PicPathArg)e;//执行内部函数this.GoSetPic(thepicpath.PicPath);}public class PicPathArg : EventArgs{//传递主窗体的数据信息public string PicPath { get; set; }}private void pictureBox1_Click(object sender, EventArgs e){//点击图片清空,为了调试用pictureBox1.Image = null;}}}我其实比较喜欢用委托,因为代码少,不过高手似乎都是用事件的 。



    推荐阅读