分享好友 工业新闻首页 频道列表

C#窗体间传值方法汇总2023更新/推荐

2023-03-10 02:54350

昨天被骂惨了!

因为我写了一个C#父窗体控制子窗体的方法,我把modifiers属性改成了public。本来只是说一下有这么个属性,没想到引起了这顿喷哈哈,虚心接受,感谢朋友们的支持。

我错了!我重新写!

最终效果,就是点主窗体的按钮,更改子窗体picturebox的图片

 

新建项目,添加一个主窗体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;        }    }}
我其实比较喜欢用委托,因为代码少,不过高手似乎都是用事件的。 
反对 0
举报 0
收藏 0
打赏 0
青岛炼化一路狂飙:驶向“蓝海”
所有的红海都曾经是蓝海。不断上马的炼化一体化大型企业、不断释放的炼油产能、竞争白热化的成品油市场、势头强劲的新能源,无不让单一燃料型企业青岛炼化

0评论2023-03-2599

Brand Finance发布2023年“全球品牌价值500强”排行榜,中国石油排名行业第三
近期,BrandFinance发布“全球品牌价值500强”排行榜。亚马逊(Amazon)重回榜首,苹果和谷歌分列第二和第三位。中国石油(Pet

0评论2023-03-25118

油气和新能源融合发展方案发布!有哪些看点
3月22日,国家能源局网站发布了《加快油气勘探开发与新能源融合发展行动方案(2023-2025年)》(以下简称《行动方案》),这是国家能源主管部

0评论2023-03-25117