<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們在做Winform表單程式開發的時候,會經常遇到表單之間相互傳值。假設有下面的一個場景:一個主表單和一個子表單,點選主表單上面的按鈕給子表單傳值,並在子表單上面顯示出來,一般會有如下幾種方式實現。
我們可以在子表單裡面定義一個公共的屬性,然後在父表單裡面給公共屬性賦值,這樣可以實現表單之間傳值,子表單程式碼如下:
using System; using System.Windows.Forms; namespace DelegateDemo { public partial class frmChild : Form { public frmChild() { InitializeComponent(); } // 定義一個公共屬性,接收傳遞的值 public string strMessage { get; set; } /// <summary> /// 表單載入 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frmChild_Load(object sender, EventArgs e) { // 將接收到的值顯示在表單上 this.lblMessage.Text = strMessage; } } }
父表單程式碼:
using System; using System.Windows.Forms; namespace DelegateDemo { public partial class frmParent : Form { public frmParent() { InitializeComponent(); } /// <summary> /// 單擊事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Value_Click(object sender, EventArgs e) { frmChild child = new frmChild(); // 給表單的公共屬性賦值 child.strMessage = this.txtMessage.Text.Trim(); // 顯示子表單 child.Show(); } } }
這種方式有一個缺點:屬性需要設定為public,不安全。
我們還可以在子表單裡面定義一個方法,通過呼叫方法傳值,子表單程式碼如下:
using System; using System.Windows.Forms; namespace DelegateDemo { public partial class frmChild : Form { public frmChild() { InitializeComponent(); } // 定義一個公共屬性,接收傳遞的值 //public string strMessage { get; set; } // 定義屬性為private private string strMessage { get; set; } /// <summary> /// 給私有屬性賦值 /// </summary> /// <param name="strText"></param> public void SetText(string strText) { strMessage = strText; } /// <summary> /// 表單載入 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frmChild_Load(object sender, EventArgs e) { // 將接收到的值顯示在表單上 this.lblMessage.Text = strMessage; } } }
父表單程式碼:
using System; using System.Windows.Forms; namespace DelegateDemo { public partial class frmParent : Form { public frmParent() { InitializeComponent(); } /// <summary> /// 單擊事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Value_Click(object sender, EventArgs e) { #region 呼叫公共屬性賦值 //frmChild child = new frmChild(); //// 給表單的公共屬性賦值 //child.strMessage = this.txtMessage.Text.Trim(); //// 顯示子表單 //child.Show(); #endregion #region 呼叫方法賦值 frmChild child = new frmChild(); // 給表單的公共屬性賦值 child.SetText(this.txtMessage.Text.Trim()); // 顯示子表單 child.Show(); #endregion } } }
這種方式同樣也有缺點:屬性雖然是private的了,但是方法還是public的。
上述兩種方式都是不安全,下面我們使用委託來實現表單之間傳值。
我們在主表單裡面定義一個有參無返回值的委託:
// 定義一個有參無返回值的委託 private delegate void SendMessage(string strMessage);
在父表單裡面定義一個委託型別的事件:
// 定義一個委託型別的事件 public event SendMessage sendMessageEvent;
委託與事件的關係,事件相對於委託更安全,更低耦合。委託是一個型別,事件是委託型別的一個範例。
這裡其實就是在子表單裡面定義一個給控制元件賦值的方法:
/// <summary> /// 給控制元件賦值的方法 /// </summary> /// <param name="strValue"></param> public void SetValue(string strValue) { this.lblMessage.Text = strValue; }
frmChild child = new frmChild(); // 將方法系結到事件上 sendMessageEvent += new SendMessage(child.SetValue); // 也可以使用下面的簡寫形式 // sendMessageEvent += child.SetValue; child.Show();
在按鈕的點選事件裡面觸發委託:
if(sendMessageEvent!=null) { sendMessageEvent.Invoke(this.txtMessage.Text.Trim()); }
上面的程式碼中使用的是自定義的委託,我們也可以使用.Net 框架裡面自帶的Action泛型委託:
using System; using System.Windows.Forms; namespace DelegateDemo { public partial class frmParent : Form { // 定義一個有參無返回值的委託 public delegate void SendMessage(string strMessage); // 定義一個委託型別的事件 public event SendMessage sendMessageEvent; public event Action<string> actionEvent; public frmParent() { InitializeComponent(); } /// <summary> /// 單擊事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Value_Click(object sender, EventArgs e) { #region 呼叫公共屬性賦值 //frmChild child = new frmChild(); //// 給表單的公共屬性賦值 //child.strMessage = this.txtMessage.Text.Trim(); //// 顯示子表單 //child.Show(); #endregion #region 呼叫方法賦值 //frmChild child = new frmChild(); //// 給表單的公共屬性賦值 //child.SetText(this.txtMessage.Text.Trim()); //// 顯示子表單 //child.Show(); #endregion #region 通過委託傳值 //frmChild child = new frmChild(); //// 將方法系結到事件上 //// sendMessageEvent += new SendMessage(child.SetValue); //// 也可以使用下面的簡寫形式 //sendMessageEvent += child.SetValue; //child.Show(); #endregion #region 使用Action frmChild child = new frmChild(); // 將方法系結到事件上 actionEvent += child.SetValue; child.Show(); #endregion // 使用自定義委託 //if (sendMessageEvent!=null) //{ // sendMessageEvent.Invoke(this.txtMessage.Text.Trim()); //} // 使用Action委託 if (actionEvent != null) { actionEvent.Invoke(this.txtMessage.Text.Trim()); } } } }
完整範例程式碼:https://github.com/jxl1024/FromPassValueDemo
到此這篇關於C#開發Winform實現表單間相互傳值的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45