天天看點

C#窗體間傳值方法彙總

昨天被罵慘了!

因為我寫了一個C#父窗體控制子窗體的方法,我把modifiers屬性改成了public。本來隻是說一下有這麼個屬性,沒想到引起了這頓噴哈哈,虛心接受,感謝朋友們的支援。

我錯了!我重新寫!

C#窗體間傳值方法彙總
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;
        }
    }
}           

我其實比較喜歡用委托,因為代碼少,不過高手似乎都是用事件的。

繼續閱讀