昨天被罵慘了!
因為我寫了一個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;
}
}
}